Почему не работает исправление обезьяны Hash.new?

Я лечу класс Ruby Hash.

class Hash
  alias_method :_initialize, :initialize

  def initialize
     puts 'In my hash class'
     _initialize
  end
end

Когда я делаю

Hash.new

он работает так, как ожидалось. Но скажем, у меня есть функция, которая принимает Hash. Что-то типа,

foo 'a' => 'b'

В этом случае мой класс Hash не используется. Я ожидаю, что будет вызван метод initialize моего класса Hash. Почему оно так себя ведет?


person Navaneeth K N    schedule 20.03.2013    source источник


Ответы (1)


Потому что буквальный хэш не будет вызывать метод initialize, который вызовет Hash.new.

То же, что Hash['a', 'b'] или Hash['a' => 'b']

person xdazz    schedule 20.03.2013
comment
Это странно. Инициализировать конструктор правильно? Значит, он вызывается при создании любого экземпляра класса, верно? - person Navaneeth K N; 20.03.2013
comment
@Appu да, я тоже так думаю, как объект будет создан без инициализации :( - person Arup Rakshit; 20.03.2013
comment
@xdazz, ты знаешь, где в исходном коде МРТ это можно увидеть? - person galymzhan; 20.03.2013
comment
Нет, initialize не конструктор. В Ruby нет конструкторов. initialize — это метод точно такой же, как и любой другой метод. Если не звонить, то и звонить не будут. Просто как тот. - person Jörg W Mittag; 20.03.2013
comment
@JörgWMittag Вы ошибаетесь на 100% - rubyist.net/~slagell/ruby/objinitialization .html - person chintanparikh; 05.01.2015
comment
@chintanparikh: Нет, не я. Class#new вызывает initialize по умолчанию, но new - это такой же метод, как и любой другой, его можно переопределить или исправить, чтобы не вызывать initialize. initialize не вызывается волшебным образом всякий раз, когда объект инициализируется. На самом деле довольно часто инициализация объектов выполняется без вызова initialize, например. при cloneing или duping объектах или при десериализации из Marshal, JSON, YAML, XML и т. д. - person Jörg W Mittag; 05.01.2015