数字扩展模块和模块的扩展方法

时间:2012-02-06 21:43:17

标签: ruby ruby-1.9.3

当一个对象的实例扩展一个模块并且在模块上调用了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

更新:好的,所以一个Object和一个String工作,但为什么数字不起作用?我得到TypeError: can't define singleton

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你无法在ruby中的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