3

Hashを拡張するクラスがあり、ハッシュキーがいつ変更されたかを追跡したいと思います。

[key]=これを達成するために構文メソッドをオーバーライドする正しい構文は何ですか?コードを挿入してから、親メソッドを呼び出します。

これはCメソッドで可能ですか?ドキュメントから、基になるメソッドは

rb_hash_aset(VALUE hash, VALUE key, VALUE val)

それはどのようにブラケット構文に割り当てられますか?

4

3 に答える 3

7

メソッドのシグネチャは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
于 2012-10-20T13:52:34.870 に答える
3

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
于 2012-10-20T14:11:16.827 に答える
2
class MyHash < Hash
  def []=(key,value)
    super
  end
end
于 2012-10-20T13:49:37.810 に答える