Как перехватить вызов конструктора класса Hash? - PullRequest
2 голосов
/ 18 марта 2011

Я хочу выполнить функцию, когда вызывается конструктор класса Hash или когда инициализируется объект Hash.Я реализовал свою цель, используя

class Hash
  def initialize
    p "Constructor call"
  end
end

Приведенный выше код прекрасно работает, когда объект Hash инициализируется следующим образом:

a = Hash.new(:a1 => "Hi")

Однако, когда я использую следующий код:

a = {:a1 => "Hi"}

Затем происходит сбой или конструктор не вызывается.Итак, как перехватить вызов, сделанный во втором фрагменте кода?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

К сожалению, как и почти на любом другом языке, вы не можете переопределить литералы в Ruby. Вам придется использовать один из немногих языков, которые позволяют это, например Ioke :

cell(:{}) = method(+x, "Literal {} called with #{x inspect}" println)

{ :a1 => "Hi" }
;; Literal {} called with [:a1 => "Hi"]

(На самом деле, Ioke - это язык only , о котором я могу думать прямо сейчас, который допускает буквальную перегрузку / переопределение. Я полагаю, кузен Ioke Seph поддержит его, и пара Несколько лет назад в Newspeak велись споры о разрешении этого, но это все.)

2 голосов
/ 18 марта 2011

Боюсь, что вы не можете в МРТ, но, вероятно, могли бы что-то сделать в Рубиниусе / JRuby.

...