确定缺少方法调用的方法名称

时间:2014-02-23 06:06:58

标签: ruby

我有一个基于缺少方法调用执行特殊指令的类

class MyClass
  def method_missing(mname, *args)
    p mname
    nil
  end
end

执行以下操作....

obj = MyClass.new

obj.method1

将打印出:method1

但是,如果我这样做......

obj.method1.method2

我无法以可以打印method_missing的方式定义:method2

(注意:我必须在我的method_missing方法中返回nil)

有什么想法吗?

更新

好吧,我实际上要做的事情有点奇怪,而且我不确定这是否可能,但我的尝试是为了解释它。

我有一个类似的课程:

class MyClass
  def method_missing(mname, *args)
    return some_var[mname]
  end
end

如果mcMyClass的实例,我希望能够调用mc.method并获取特定对象。

现在,我还希望能够调用mc.method.some_other_method,其中some_other_methodmc.method

返回的对象的方法

这是一个棘手的部分:调用mc.method.some_other_method时,MyClass按照它的方式编写,满足我的需要(即我返回对象,并调用some_other_method)。但是,如果只调用mc.method,我需要这样的东西......

class MyClass
  def method_missing(mname, *args)
    #if ONLY mc.method
    some_var[mname].sanitize
    return some_var[mname]
  end
end

我知道解决这个问题的方法就是使用MyClass的第二个版本,它应该适用于两种情况(mc.methodmc.method.some_other_method)但事实是,我只需要调用{ {1}}在调用sanitize时,而不是在调用mc.method时调用{1}}。 sanitize是一种资源密集型方法(我只想在必要时调用它)。

尽管如此,除了每次只调用mc.method.some_other_method之外,还有其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

更新后,您尝试做的事情开始看起来像ActiveRecord过滤器链。如果没有任何其他链调用(method2),它被设计为仅查询DB(在您的情况下调用sanitize)。突然之间,红宝石无法知道是否会有一个通话,当方法返回时,你永远不知道结果会发生什么。

ActiveRecord用来解决问题的技巧是返回中间链对象,只有在调用eachto_amap等方法时才会触发数据库加载。也就是说,仅当用户请求查询结果时。

考虑到这一点,你可以想象对象旁边会发生什么。也许有这样的触发方法?至少,您可以随时添加它们

obj.method1.load!
obj.method1.method2.load!