我有一个包装任意数据单元的类;一种过滤器。这些单元存在于后端数据存储中。但这应该尽可能透明。
编写简单的访问器很简单:
def foo
# fetch backend cell value and return it
end
def foo=(val)
# store val in backend cell
end
我发现棘手的部分是拦截和跟踪方法,如果数据没有被包装,这些方法通常会影响数据。例如,如果数据是一个数组,则会在原位obj.foo << 17
向数组中添加一个元素。我想在后端存储的数据上保持这种行为(即,导致存储的值也添加了一个元素)。我想也许 a会有所帮助:obj.foo << 17
method_missing
def method_missing(meth, *args)
methsym = meth.to_sym
curval = self.get
lastval = curval.clone
opresult = curval.__send__(methsym, *args)
if (curval != lastval)
self.set(curval)
end
return opresult
end
但是结合阅读器访问器,操作的控制已经超出了我的范围,因为它返回的东西不是东西本身。(即,如果后端数据是一个数组,我将返回它的一个副本,并且该副本正在被修改并且从未发回给我。)
这可能吗?如果是这样,我该怎么做?(这可能很明显,我只是想念它,因为我累了——或者可能不是。:-)
谢谢!
[编辑]
换句话说.. #method_missing
允许您挂钩未知方法的调用过程。我正在寻找一种方法来类似地挂接到调用过程中,但是对于所有已知和未知的方法。
谢谢!