這個問題有兩個部分。擴展類和實例
在Ruby編程語言手冊中,有一個使用模塊擴展字符串對象和類的示例(第8.1.1節)。
第一個問題。爲什麼如果你用新方法擴展一個類,然後創建該類的對象/實例,那麼你不能訪問該方法?
irb(main):001:0> module Greeter; def ciao; "Ciao!"; end; end
=> nil
irb(main):002:0> String.extend(Greeter)
=> String
irb(main):003:0> String.ciao
=> "Ciao!"
irb(main):004:0> x = "foo bar"
=> "foo bar"
irb(main):005:0> x.ciao
NoMethodError: undefined method `ciao' for "foo bar":String
from (irb):5
from :0
irb(main):006:0>
第二部分,當我嘗試擴展Fixnum對象時,出現未定義的方法錯誤。有人可以解釋爲什麼這適用於字符串,但不是fixnum?
irb(main):045:0> module Greeter; def ciao; "Ciao!"; end; end
=> nil
irb(main):006:0> 3.extend(Greeter)
TypeError: can't define singleton
from (irb):6:in `extend_object'
from (irb):6:in `extend'
from (irb):6
你回答第一部分沒有解釋(對我)的原因。在其他語言中,當您更改類並創建該類類型的新對象時,您將獲得新方法。我假定從類到對象的連接是無效的。你能解釋爲什麼這個連接在這裏無效嗎? – teleball 2009-11-08 18:00:31
研究「包括」你給了我幫助。所以,現在看起來我明白擴展和包含之間存在差異,現在知道要搜索什麼,這裏有一篇文章解釋了這些差異:http://stackoverflow.com/questions/156362/what-是最差之間-包括和 - 延長功能於紅寶石 – teleball 2009-11-08 18:10:09