有没有人知道一种方法来拦截dynamic方法调用(特别是那些将要提升RuntimeBinderExceptions的方法)RealProxy?我希望捕获异常并在其上实现'方法缺失',但它似乎在拦截器获得查看之前被抛出.
我的测试看起来像:
dynamic hello = MethodMissingInterceptor<DynamicObject>.Create();
Assert.AreEqual("World", hello.World());
Run Code Online (Sandbox Code Playgroud)
哪里World没有实际实施DynamicObject.拦截器是非常简单的-我希望检查IMethodReturnMessage.Exception的RuntimeBinderException,并转发到是这样的:
public IMessage MethodMissing(IMethodCallMessage call)
{
return new ReturnMessage(call.MethodBase.Name, new object[0], 0, call.LogicalCallContext, call);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我在拦截器中看到的只是一些调用GetType,而不是不存在的World方法.
失败了 - 有没有人知道是否有一个DynamicProxy版本在.NET 4.0上运行得很快但可能解决了这个问题?
我相当肯定,在Lua中,你可以使用一个给定的元表的__index,__newindex和__call大致复制Ruby的method_missing.我有点:
function method_missing(selfs, func)
local meta = getmetatable(selfs)
local f
if meta then
f = meta.__index
else
meta = {}
f = rawget
end
meta.__index = function(self, name)
local v = f(self, name)
if v then
return v
end
local metahack = {
__call = function(self, ...)
return func(selfs, name, ...)
end
}
return setmetatable({}, metahack)
end
setmetatable(selfs, meta)
end
_G:method_missing(function(self, name, ...)
if name=="test_print" then
print("Oh my lord, it's method missing!", …Run Code Online (Sandbox Code Playgroud) 我似乎记得Lua有类似Ruby的method_missing.还是我记错了?
我有一个具有多个日期属性的模型.我希望能够设置和获取值作为字符串.我过度使用其中一个方法(bill_date),如下所示:
def bill_date_human
date = self.bill_date || Date.today
date.strftime('%b %d, %Y')
end
def bill_date_human=(date_string)
self.bill_date = Date.strptime(date_string, '%b %d, %Y')
end
Run Code Online (Sandbox Code Playgroud)
这对我的需求很有帮助,但我想对其他几个日期属性做同样的事情...我如何利用方法缺失,以便可以设置/得到任何日期属性?
activerecord overriding ruby-on-rails method-missing dynamic-attributes
我有一个Ruby对象(特别是一个ActiveRecord对象)User.它响应像find_by_id,find_by_auth_token等等方法.但是,这些不是通过def或定义的方法define_method.相反,它们是通过处理的动态方法method_missing.
我想通过以下方式获得对这些方法之一的引用Object#method:
User.method(:find_by_auth_token)
Run Code Online (Sandbox Code Playgroud)
虽然看起来不像这样.我提出的最佳解决方案是:
proc { |token| User.find_by_auth_token(token) }
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以使用这样的包装方法?我真的无法Object#method用于动态方法吗?
我有一个数据集,其中包含两个级别 Male(M) 和 Female(F) 的变量 GENDER 有很多缺失值。我如何处理缺失值?处理这些缺失值的不同方法是什么。任何帮助,将不胜感激。
Ruby有method_missing,Ruby 有getattr.Boo是否提供了我可以用来拦截方法调用的东西?
我经常这样做:
CoolViewController *coolViewController = [[CoolViewController alloc] init];
[self.navigationController pushViewController:coolViewController animated:YES];
[coolViewController release];
Run Code Online (Sandbox Code Playgroud)
在一个类别中UINavigationController,我将如何覆盖,forwardInvocation:以便我可以改为:
[self.navigationController pushCoolViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)
请在答案中包含相关代码,而不仅仅是解释.谢谢!
请随意评论这是否是一种好的做法.我也问这个用于教育目的,但在我看来,在这种情况下,代码的简化可能会超过处理时间和内存使用的不明显(正确?)成本.此外,我来自Ruby背景,喜欢使用动态编程来简化事物,例如find_by_nameRails中的动态查找器(例如).
如果您可以pushCoolViewControllerAnimated:withBlock在初始化视图控制器后实现并调用块,则允许我在创建的视图控制器上设置某些实例变量.
更新:我记得ARC即将推出.因此,这个具体示例可能不那么有用,但仍然是一个很好的练习/示例,可以在其他情况下使用,例如,Core Data的动态查找器和传递块来配置NSFetchRequest.
在Ruby中,您可以捕获对缺少的方法的调用,并在运行中定义它.
我想在JavaScript中完成的是拥有一个没有方法的对象.我想将一个缺少的方法转换为对emit()的调用:
app.isReady() -> app.emit("isReady")
soldier.kills() -> soldier.emit("kills")
Run Code Online (Sandbox Code Playgroud)
我认为最好捕获丢失的方法错误并运行emit(methodName),而不是在运行时定义所有方法(来自固定列表).这样,如果对象有数百或数千个事件,我们就没有性能开销.
做这个的最好方式是什么?
更新:这是一个API设计,所以我宁愿远离:
try {
app.isReady()
} catch(e) {
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何在幕后完成这一点,以便用户可以像往常一样使用方法.
method-missing ×10
lua ×2
ruby ×2
.net ×1
activerecord ×1
boo ×1
c# ×1
c#-4.0 ×1
dynamic ×1
intercept ×1
javascript ×1
missing-data ×1
nsobject ×1
objective-c ×1
overriding ×1
porting ×1
proxy ×1
reification ×1
sample ×1
scala ×1
syntax ×1