2011-11-02 1 views
6

사람들이 Ruby에서이 작업을 수행하는 방법에 대해 뭔가 빠뜨린 것 같습니다. '무엇을'에
: 보호 방법은 푸 대한 소위 'zoop'Ruby의 인스턴스 메소드에서 보호 된 클래스 메소드에 어떻게 액세스합니까?

경우 '#protected은'우리가 얻을 주석 인 클래스 (NoMethodError)

보호 클래스 메소드에 접근 할 수있는 더 나은 방법이 있나요? 내가 zoop을 부탁

class Foo 
    class << self 
    #protected 
    def zoop 
     "zoop" 
    end 
    end 
    public 
    def what 
    "it is '#{self.class.zoop}'" 
    end 
    protected 
end 

a = Foo.new 
p a.what # => "it is 'zoop'" 

보호 할 수 있습니다 또는 개인 (부름 'Foo.zoop')는,하지만 지금까지, 나는 우아한 방법을 찾을 수가 수 없습니다.

+0

클래스의 인스턴스가 다른 객체보다 클래스의 싱글 톤 메소드에 더 친밀한 액세스를 가져야한다는 기본 가정이 있습니까? –

+0

실제로. 그리고 잘 말했다. –

답변

2

: 당신이 보호 사용 센드()이 같은 상태를 유지하는 zoop하려면

루비 - 랭에, 내 충격에 의해 메모리를 절약하는 것으로 나타났다 계급 수준에서 유틸리티 기능을 배치하는 것은 잘못되었다.

루비에서는 인스턴스 메소드가 클래스와 어슬렁 어슬렁 거리며 답을 찾아 인스턴스 레벨의 유틸리티 함수를 private으로 배치합니다. 요약

만 인스턴스 방법으로 액세스하는 유틸리티 기능 :

class Foo 
    def what 
    "it is '#{zoop}'" 
    end 
    private 
    def zoop 
    "zoop" 
    end 
end 

p Foo.new.what # => "it is 'zoop'" 

인스턴스와 클래스 메소드에서 호출해야하는 유틸리티 함수의 경우는 중첩 된 모듈은 인기있는 방법이 될 듯 :

class Foo 
    module Util 
    def self.zoop 
     "zoop" 
    end 
    end 
    def what 
    "it is '#{Util.zoop}'" 
    end 
    class << self 
    def class_what 
     "for all time it is '#{Util.zoop}'" 
    end 
    end 
end 

p Foo.new.what # => "it is 'zoop'" 
p Foo.class_what # => "for all time it is 'zoop'" 
p Foo::Util.zoop # visible, alas 
2

Ruby에서 메소드를 비공개 또는 보호하는 것은 거의 문제가되지 않습니다. send()를 호출하여 주변을 둘러 볼 수 있기 때문입니다. 및 drbrain : 더 후회와 토론시

def what 
    "it is '#{self.class.send(:zoop)}'" 
end