2011-11-02 9 views
6

私はRubyでこれをどうやって行うのか、何か不足しているはずです。Rubyのインスタンスメソッドから保護されているクラスメソッドにどのようにアクセスしますか?

「#protectedは」コメント解除されている場合は、私たちが得る:Fooのために呼ばれる保護された方法「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

:このような

あなたは(センドを使用し、保護された滞在しZOOP場合)ルビー・ラングで、それは私の衝動は、メモリを節約するためにことが判明ユーティリティー機能をクラスレベルに置くことは間違っていた。

Rubyでは、インスタンスメソッドはクラスと一緒にハングアップするため、答えは先に進んで、インスタンスレベルのユーティリティ関数を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:さらにRUEとの話し合いの際

def what 
    "it is '#{self.class.send(:zoop)}'" 
end 
関連する問題