3

我有一个扩展哈希的类,我想跟踪哈希键何时被修改。

覆盖[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

我认为 usingset_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 回答