这个问题有两个部分。扩展类和实例
在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