2011-10-17 14 views
12

内のオブジェクトのメソッドは、私はルビー(1.9)インタプリタこれまでルビー

class Foo 
    def pub 
    private_thing 
    end 

    private 
    def private_thing 
    puts "private touch" 
    end 
end 



x = Foo.new 
x.pub 
private touch 
=> nil 

とても良いから、この行動について少し混乱しています。

x.private_thing 
NoMethodError: private method `private_thing' called for #<Foo:0xb76abd34> 
from (irb):25 
from :0 

でもOKです。それは私が期待したものだ

なぜこれは空ですか?

x.methods(false) 
=> [] 

これは私に何を期待していたのですか?

Foo.instance_methods(false) 
=> ["pub"] 

答えて

7

実際、「メソッド」メソッドは消えているようです。代わりにpublic_instance_methodsを使用してください。

x.methods(false)がそのように動作する理由を説明するには、ルビ1.9.1のドキュメントhttp://www.ruby-doc.org/core-1.9.1/Object.html#method-i-methodsを振り返ります。パラメータを渡すとソースコードが表示された場合、それはあなたが抱いているものであるsingleton_methodsとして動作します。

1

ruby​​ 1.9.1を超えるObject#メソッドのドキュメントはありません。あたかもそれが存在しないかのように。 (http://www.ruby-doc.org/core-1.9.3/Object.htmlを参照してください)

これは、メソッドがどこに存在するかを判断するために、.singleton_methodsまたは.instance_methodsのいずれかを使用する必要があることを明確にするためです。

いずれにしても、文書化されていない方法でも、好きなことを行うことができます。