标签: method-missing

方法缺少C#4.0中的困难:动态与RealProxy

有没有人知道一种方法来拦截dynamic方法调用(特别是那些将要提升RuntimeBinderExceptions的方法)RealProxy?我希望捕获异常并在其上实现'方法缺失',但它似乎在拦截器获得查看之前被抛出.

我的测试看起来像:

dynamic hello = MethodMissingInterceptor<DynamicObject>.Create();
Assert.AreEqual("World", hello.World());
Run Code Online (Sandbox Code Playgroud)

哪里World没有实际实施DynamicObject.拦截器是非常简单的-我希望检查IMethodReturnMessage.ExceptionRuntimeBinderException,并转发到是这样的:

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上运行得很快但可能解决了这个问题?

c# proxy dynamic method-missing c#-4.0

6
推荐指数
1
解决办法
2783
查看次数

是否有可能在Lua中复制Ruby的method_missing?

我相当肯定,在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)

syntax lua metaprogramming method-missing

6
推荐指数
1
解决办法
364
查看次数

5
推荐指数
3
解决办法
1649
查看次数

5
推荐指数
1
解决办法
349
查看次数

使用Rails中缺少的方法

我有一个具有多个日期属性的模型.我希望能够设置和获取值作为字符串.我过度使用其中一个方法(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

5
推荐指数
2
解决办法
4564
查看次数

对象#方法和动态响应者

我有一个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用于动态方法吗?

ruby method-missing

5
推荐指数
1
解决办法
95
查看次数

数据分析中的缺失值

我有一个数据集,其中包含两个级别 Male(M) 和 Female(F) 的变量 GENDER 有很多缺失值。我如何处理缺失值?处理这些缺失值的不同方法是什么。任何帮助,将不胜感激。

machine-learning data-analysis method-missing missing-data

5
推荐指数
2
解决办法
2670
查看次数

如何拦截Boo中的方法调用?

Ruby有method_missing,Ruby 有getattr.Boo是否提供了我可以用来拦截方法调用的东西?

.net boo method-missing intercept

4
推荐指数
1
解决办法
433
查看次数

Objective-C forwardInvocation:

我经常这样做:

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)
  1. 请在答案中包含相关代码,而不仅仅是解释.谢谢!

  2. 请随意评论这是否是一种好的做法.我也问这个用于教育目的,但在我看来,在这种情况下,代码的简化可能会超过处理时间和内存使用的不明显(正确?)成本.此外,我来自Ruby背景,喜欢使用动态编程来简化事物,例如find_by_nameRails中的动态查找器(例如).

  3. 如果您可以pushCoolViewControllerAnimated:withBlock在初始化视图控制器后实现并调用块,则允许我在创建的视图控制器上设置某些实例变量.

更新:我记得ARC即将推出.因此,这个具体示例可能不那么有用,但仍然是一个很好的练习/示例,可以在其他情况下使用,例如,Core Data的动态查找器和传递块来配置NSFetchRequest.

objective-c method-missing nsobject

4
推荐指数
1
解决办法
1221
查看次数

Javascript中缺少捕获方法并做一些逻辑?

在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)

我想知道如何在幕后完成这一点,以便用户可以像往常一样使用方法.

javascript porting sample reification method-missing

4
推荐指数
1
解决办法
5162
查看次数