2012-02-23 47 views
1

下面是一個例子:哪裏()在instance_eval的定義Ruby的存儲方法

class MyClass 
end 

obj = MyClass.new 
obj.instance_eval do 
    def hello 
    "hello" 
    end 
end 

obj.hello 
# => "hello" 

obj.methods.grep "hello" 
# => ["hello"] 

MyClass.instance_methods.grep "hello" 
# => [] 

MyClass的的實例方法不包含「你好」的方法,所以我的問題是在哪裏紅寶石存儲(在instance_eval的定義的方法)?

+0

第一次確定是否有錯字? – lucapette 2012-02-23 22:49:05

回答

2

看看這個:

obj = MyClass.new 
def obj.hello 
    "hello" 
end 

obj.hello #=> "hello" 
obj.singleton_methods #=> [:hello] 
obj.methods.grep :hello #=> [:hello] 

obj.instance_eval do 
    def hello2 ; end 
end # 

obj.singleton_methods #=> [:hello, :hello2] 

正如你所看到的,而不是使用instance_eval你也可以直接在對象上定義一個方法。在這兩種情況下,它們都會在對象的單例類(本徵類)中出現,可以通過Ruby 1.9中的obj.singleton_class和Ruby 1.8中的class << self ; self; end慣用法訪問。

相關問題