Как я могу переопределить метод []= при создании подкласса хэша Ruby?

У меня есть класс, который расширяет Hash, и я хочу отслеживать, когда ключ хеша изменяется.

Какой правильный синтаксис для переопределения [key]= синтаксический метод для достижения этой цели? Я хочу вставить свой код, а затем вызвать родительский метод.

Возможно ли это с помощью методов C? Я вижу из документов, что основной метод

rb_hash_aset(VALUE hash, VALUE key, VALUE val)

Как это относится к синтаксису скобок?

3 ответа

Решение

Подпись метода def []=(key, val), а также super вызвать родительский метод. Вот полный пример:

class MyHash < Hash
  def []=(key,val)
    printf("key: %s, val: %s\n", key, val)
    super(key,val)
  end
end

x = MyHash.new

x['a'] = 'hello'
x['b'] = 'world'

p x

Я думаю, используя set_trace_func это более общее решение

class MyHash < Hash
  def initialize
    super
  end

  def []=(key,val)
    super
  end
end

set_trace_func proc { |event, file, line, id, binding, classname|
  printf "%10s %8s\n", id, classname if classname == MyHash
}

h = MyHash.new
h[:t] = 't'

#=>
initialize   MyHash
initialize   MyHash
initialize   MyHash
       []=   MyHash
       []=   MyHash
       []=   MyHash
class MyHash < Hash
  def []=(key,value)
    super
  end
end
Другие вопросы по тегам