- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个包装任意数据单元格的类;一种过滤器。这些单元位于后端数据存储中。但这应该尽可能透明。
编写简单的访问器非常简单:
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/
我有一个注入(inject)了 Ninject 3.0 的服务类。我已经设置了它,因此它的代理是类代理而不是接口(interface)代理。该服务有 2 个方法,第一个方法返回广泛结果,第二个方法调用
当工具提示即将打开时,我想在状态栏中显示 wpf 应用程序中任何控件的工具提示文本。 当然,我可以尝试递归遍历主窗口的所有子控件,然后 设置他们的 ToolTipOpening事件总是相同的方法。但是
给定一个打开到 Web 服务器的套接字连接的 Flash 应用程序,是否可以读取与 Java 应用程序交换的数据包,而无需重定向所有 Flash 流量(即无需编写套接字代理)? 最佳答案 您想要做的事
我有一个文本框,我想对其进行一些验证。目前我有这段代码: function updateChanger() { // Validate input var likeMessage =
Linux 中的一些命令,例如。 ssh-agent $BASH 确保当前控制台中运行的命令的某些操作被另一个工具“拦截”。这一般是如何运作的?为了理解这一点,我应该研究哪些主题?假设我想制作一个工具
拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理 定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上 过滤器可以做认证
我一直在尝试实现应用程序范围的拦截器,但是,我一直看到以下错误: TypeError: this.interceptor.intercept is not a function 经过多次调试,我意识到
众所周知,我们可以像这样配置拦截器: 我的问题,如何配置
我正在开发一款游戏,里面有寻的导弹。目前,它们只是转向目标,这会产生看起来相当愚蠢的结果,所有导弹都跟随目标周围。 我想创造一种更致命的导弹,它将瞄准目标“将”到达的地方,但我对如何做到这一点感到有点
从 iTunes 中捕获事件有什么好的解决方案吗? 我想构建一个位于 iTunes 内部的插件,并响应特定歌曲的评级变化。对于 Windows,他们有一个我还没有深入研究的 SDK,但我也想为 Mac
现在我有一个名为 chartModelService 的 Angular 服务,上面有这个方法: this.fetchChartModel = function() { return $htt
我的 Controller 有以下方法: @RequestMapping(method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED
如果您安装了 Facebook 应用程序,并使用应用程序 openURL 方法打开 Facebook 页面,您会注意到 Facebook 应用程序接管并处理此 URL,而不是 Safari 执行此操作
我有这样一个类: class A { public static void makeCall() { URL url = "www.google.com"; I
我希望我的应用拦截手机发现的所有标签。这样我想检查标签的 uid 并在之后传递 Intent (显示应用程序选择器等)。 这就是我目前在 list 中的内容,以及用于 TAG_DISCOVERE
我正在用 Playwright's API testing 测试服务器. 我有一个简单的 GET 路由,它总是返回 405 not allowed。它还记录调用了 API 路由。为了这个 StackO
有什么方法可以拦截 Android WebView 中的重定向请求? shouldInterceptRequest(WebView,WebResourceRequest) 似乎没有被调用! 我想通过以
This question already has answers here: Element MyElement is not clickable at point (x, y)… Other el
我有一个拦截器,捕获404错误 拦截(要求:HttpRequest,下一个:HttpHandler):可观察> return next.handle(req).pipe(retry(1),
有没有办法让 Cypress 捕获任何未使用 cy.intercept 处理和 stub 的请求。我希望 Cypress 返回一个有用的错误,以突出显示发出未 stub 请求的实例。目前它只是让这些请
我是一名优秀的程序员,十分优秀!