2012-02-06 108 views
1

当对象的实例扩展模块并在模块上调用extended时,base是否已扩展模块?数字扩展模块,当处于模块的扩展方法中时

module M 
    def self.extended base 
    # when this is called has base extended 
    end 

    def self.some_method 
    # that does something special ;) 
    end 
end 

obj = Object.new 
obj.extend M 

更新:好了,对象和字符串的作品,但为什么不工作的数字?我得到TypeError: can't define singleton

回答

0

不能定义在红宝石一个Fixnum一个单身,因为真的只是其中之一(每Fixnum对象)。例如(在IRB):

1.object_id 
=> 3 
1.object_id 
=>3 

不像字符串,例如:

"panda".object_id 
=> 78405050 
"panda".object_id 
=> 78383110 

显然,具体数字会在系统上会有所不同。

这是有道理的,因为没有办法使73的特定“实例”与73的任何其他“实例”不同(并且我宽泛地使用“实例”一词,因为它实际上不是一个实例 - 他们都是同一个对象)。

http://ruby-doc.org/core-1.9.3/Fixnum.html

+1

那么如果只有一个数字'1',为什么我不能定义一个单例方法来给它赋予不同于数字'2'的专门行为呢? :) Fixnums * do *拥有自己的ivars,我看不出他们为什么不能拥有自己的单身类:) – horseyguy 2012-02-07 01:43:39

0

是!

[1] pry(main)> module Foo 
[1] pry(main)* def hi 
[1] pry(main)* end 
[1] pry(main)* def self.extended(base) 
[1] pry(main)*  base.hi 
[1] pry(main)* end 
[1] pry(main)* end 
=> nil 
[2] pry(main)> s = "" 
=> "" 
[3] pry(main)> s.extend(Foo) 
=> "" 
[4] pry(main)> quit 
+0

怎么样的数字类型? – NebulaFox 2012-02-06 22:00:18