2013-03-14 82 views
2

我是學對象的個性化在我IRB,我曾嘗試下面的代碼:在Ruby中是否可以繞過singleton方法調用?

class Foo 
    def talk 
     p "huanng" 
    end 
end 
#=> nil 

module Bar 
    def talk 
     p "hunnggg" 
    end 
end 
#=> nil 

foo = Foo.new 
#=> #<Foo:0x1152b88> 

class << foo 
    def talk 
     p "hukkangg" 
    end 
include Bar 
end 
#=> #<Class:#<Foo:0x1152b88>> 

foo.talk 
"hukkangg" 
#=> "hukkangg" 

以上輸出是如此的明顯。

反正通過傳遞該呼叫的對象foo上的單身方法talk並執行使用foo.talkclass Foo內的方法talk

尋找呼叫foo.talk的輸出爲"huanng"

編輯:

按照建議從@Anthony阿爾貝託我能達到的Bartalk

class Foo 
    def talk 
     p "huanng" 
    end 
end 
#=> nil 

module Bar 
    def talk 
     p "hunnggg" 
    end 
end 
#=> nil 

foo = Foo.new 
#=> #<Foo:0x1152b88> 

class << foo 
    def talk 
     super 
     return 
     p "hukkangg" 
    end 
    include Bar 
end 
#=> #<Class:#<Foo:0x11f6670>> 

foo.talk 
"hunnggg" 
#=> nil 

在同樣的路線如何達到Footalk繞過單方法talkBartalk

編輯

最後沒有答案,但接近實際需要的是按照@Neil

class Foo 
    def talk 
     p "huanng" 
    end 
end 
#=> nil 

module Bar 
    def talk 
     p "hunnggg" 
    end 
end 
#=> nil 

foo = Foo.new 
#=> #<Foo:0x1152b88> 

class << foo 
    def talk 
    p "hukkangg" 
    end 
    include Bar 
end 

#=> #<Class:#<Foo:0x1200db0>> 

foo.dup.talk 
#"huanng" 
#=> "huanng" 

foo.talk 
#"hukkangg" 
#=> "hukkangg" 
+0

不確定的問題。您是否想通過查找並調用Foo的實例方法「talk」來調用它,或者想要找到一種方法來撤消對實例的更改(但僅限於您選擇的方法)? – 2013-03-14 14:05:58

+0

當同樣的名字方法'talk'也在'foo'上定義爲單例方法時,查找調用'foo.talk'上的輸出爲'huanng'''。 – 2013-03-14 14:08:19

+0

你是如何期待打電話給單身人士的方法? – 2013-03-14 14:10:12

回答

2

雖然(可以理解)錯綜複雜,但你可以。你從類(繞過單例類)的實例方法並調用它foo

an_unbound_method = foo.class.instance_method(:talk) 
a_bound_method = an_unbound_method.bind(foo) 
a_bound_method.call 
+0

可能是我一直在尋找的。 Awsome :) ...什麼是「綁定」?我在Ruby時代的1.5個月內從未使用過「綁定」。 '+ 1'給你。你能否解釋一下'bind'如何繞過? – 2013-03-14 15:47:39

+0

你能告訴我你的答案能夠繞過嗎?該方法查找是如何發生的,對於哪種單例方法'talk'已被跳過? – 2013-03-14 20:29:52

2

技術上不調用針對相同的實例,但DUP韓元't複製單身的東西(克隆),所以你可以這樣做:

foo.dup.talk 

。 。 。在某些情況下它可能會足夠好?

+0

不錯,不知道這個。 – 2013-03-14 15:11:45

相關問題