Hashを拡張するクラスがあり、ハッシュキーがいつ変更されたかを追跡したいと思います。
[key]=
これを達成するために構文メソッドをオーバーライドする正しい構文は何ですか?コードを挿入してから、親メソッドを呼び出します。
これはCメソッドで可能ですか?ドキュメントから、基になるメソッドは
rb_hash_aset(VALUE hash, VALUE key, VALUE val)
それはどのようにブラケット構文に割り当てられますか?
メソッドのシグネチャは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