Как я могу переопределить метод []= при создании подкласса хэша 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