Ruby中的通用方法/默认方法,当未定义某些方法时

时间:2012-05-23 18:15:01

标签: ruby oop metaprogramming

我想做点什么,但我不确定是否有可能。我想在调用某些方法但未定义某些方法时使用“泛型方法”或“默认方法”。这是一个简单的例子,因此您可以理解我的观点:

这是班级:

class XYZ

    def a
        #...
    end

    def b
        #...
    end
end

类XYZ的实例:

n = XYZ.new
n.a
n.b
n.c

正如您所看到的,我正在调用未定义的方法“c”,它将引发错误。我可以在XYZ类中执行某些操作,这样当有人调用未定义的方法时,获取方法的名称并根据方法名称执行某些操作吗?并且,这可能用另一种语言(不是编译器)吗?如果这是可能的,它是如何被称为(理论上讲)?

2 个答案:

答案 0 :(得分:4)

使用method_missing

class XYZ
  def a; end
  def b; end

  def method_missing(name, *args)
    "Called #{name} with args: #{args}"
  end
end

XYZ.new.c #=> "Called c"

您还应定义respond_to_missing?以使respond_to?在1.9.2+中更好地工作。你应该read more about respond_to?/respond_to_missing? when using method_missing

顺便说一下,这将被视为元编程。由于它们调用函数的方式,在编译语言中通常不可能这样做。

答案 1 :(得分:3)

它叫做method_missing。 当您调用未在object上定义的方法时,ruby会将调用重定向到method_missing方法,该方法会为您引发错误。

你可以这样做:

class XYZ
  def method_missing(method, *args, &blck)
    puts "called #{method} with arguments #{args.join(',')}"
  end
end

现在而不是错误,您将获得输出到您的控制台。