Есть ли способ улучшить метод инициализации некоторого класса в Ruby? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь сделать что-то вроде этого:

module RefinedHash
  refine Hash do
    def initialize(*args)
      super
      # something here
    end

    def [](key)
      'whatever'
    end
  end
end

class Hello
  using RefinedHash

  def initialize
    h = Hash.new
    p h[:test]
  end
end

Hello.new # => "whatever"

В результате [] работает хорошо и возвращает 'whatever' для вызовов с любым ключом (только для целей тестирования, чтобы знать, что наше уточнение было эффективно применено). Но, увы, любой код в усовершенствованном методе initialize вообще не будет выполняться, когда я создаю свой хэш с Hash.new там. Я что-то упустил или где-то указано, что initialize не может быть уточнено, как любой другой метод?

1 Ответ

0 голосов
/ 10 января 2019

Я не уверен, почему initialize не работает. Это может быть потому, что Class#allocate вызывает его каким-то образом, который обходит механизм уточнения? Но вы можете уточнить new, для того же эффекта:

module RefinedHash
  refine Hash.singleton_class do
    def new(*args)
      obj = super
      # something here
      obj
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...