【发布时间】:2011-08-29 20:51:39
【问题描述】:
我有一个封装任意数据单元的类;一种过滤器。这些单元存在于后端数据存储中。但这应该尽可能透明。
编写简单的访问器很简单:
def foo
# fetch backend cell value and return it
end
def foo=(val)
# store val in backend cell
end
我发现棘手的部分是拦截和跟踪方法,如果数据没有被包装,这些方法通常会影响数据。例如,如果数据是一个数组,obj.foo << 17 将原位向数组添加一个元素。我想在后端存储的数据上保持这种行为(即,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 允许您挂钩到未知方法的调用过程。我正在寻找一种方法来类似地挂接到调用过程中,但对于 所有 方法,已知 和 未知。
谢谢!
【问题讨论】:
标签: ruby methods method-chaining