Номер расширяет модуль и в расширенном методе модуля - PullRequest
1 голос
/ 07 февраля 2012

Когда экземпляр объекта расширяет модуль и вызывается 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

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Вы не можете определить синглтон для Fixnum в ruby, потому что на самом деле существует только один из них (для каждого Fixnum). Например (в IRB):

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

В отличие от строк, например:

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

Очевидно, что конкретные цифры будут различаться в вашей системе.

Это имеет смысл, поскольку нет никакого способа, чтобы конкретный «экземпляр» 73 отличался от любого другого «экземпляра» 73 (и я свободно использую слово «экземпляр», потому что это на самом деле не экземпляр - они все один и тот же объект).

http://ruby -doc.org / ядро-1.9.3 / Fixnum.html

0 голосов
/ 07 февраля 2012

Да!

[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
...