2011-11-02 87 views
6

我一定錯過了人們如何在Ruby中這樣做。如何從Ruby中的實例方法訪問受保護的類方法?

如果「#protected」是註釋掉我們得到:在「是什麼」
:保護法「ZOOP」呼籲富:類(NoMethodError)

有沒有更好的方式來處理類方法保護?

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'" 

我想ZOOP要保護或私有的(沒有調用「Foo.zoop」),但到目前爲止,我似乎無法找到一個優雅的方式。

+0

是否有一個潛在的假設,一個類的實例應該比其他對象有更親密的訪問類的單例方法? –

+0

確實。並且說得好。 –

回答

2

在與芸香進一步討論:和drbrain:紅寶石琅,事實證明,我的衝動,通過節省內存在課堂上放置效用函數是錯位的。

在Ruby中,實例方法無論如何都會掛掉類,答案是繼續前進,並將實例級別的實用程序功能置於實例級別。

綜上所述,即只通過實例方法訪問的效用函數:

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

由於您可以調用send()來繞過它們,所以在Ruby中使方法保持私有或保護幾乎沒有關係。

如果你想ZOOP留保護,使用send()是這樣的:

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