gpt4 book ai didi

ruby 1.8.7 : intercepting chained methods for object

转载 作者:数据小太阳 更新时间:2023-10-29 08:01:39 25 4
gpt4 key购买 nike

我有一个包装任意数据单元格的类;一种过滤器。这些单元位于后端数据存储中。但这应该尽可能透明。

编写简单的访问器非常简单:

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允许您 Hook 到未知方法的调用过程。我正在寻找一种类似地 Hook 调用过程的方法,但对于所有方法,已知未知。

谢谢!

最佳答案

您需要将您的类返回的每个对象包装在一个元对象中,该元对象可以识别后端,并可以根据需要更新它。

在您的示例中,您需要返回一个可以处理插入、删除等操作的数组包装器对象。

--- 编辑 ---

您可以向返回的对象添加“单例方法”,而不是创建大量包装类,尤其是当您可以轻松识别可能需要特殊处理的方法时。

module BackEndIF
alias :old_send :__send__
def __send__ method, *args
if MethodsThatNeedSpecialHandling.include?(method)
doSpecialHandling()
else
old_send(method,args)
end
end
end

#in your class:
def foo
data = Backend.fetch(query)
data.extend(BackEndIF)
return data
end

我认为基于方法缺失的任何方法都行不通,因为您返回的对象确实具有相关方法。 (即 Array 确实有一个运算符<<,它没有丢失)

或者,也许您可​​以像您概述的那样使用 method_missing 做一些事情。像这样创建一个元对象:

class DBobject
def initialize(value, db_reference)
@value = value
@ref = db_reference
end
def method_missing(meth, *args)
old_val = @value
result = @value.__send__(meth, *args)
DatabaseUpdate(@ref, @value) if (@value != old_val)
return result
end
end

然后 foo 返回一个 DBObject.new(objectFromDB, referenceToDB)

关于 ruby 1.8.7 : intercepting chained methods for object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7235846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com