我想做点什么,但我不确定是否有可能。我想在调用某些方法但未定义某些方法时使用“泛型方法”或“默认方法”。这是一个简单的例子,因此您可以理解我的观点:
这是班级:
class XYZ
def a
#...
end
def b
#...
end
end
类XYZ的实例:
n = XYZ.new
n.a
n.b
n.c
正如您所看到的,我正在调用未定义的方法“c”,它将引发错误。我可以在XYZ类中执行某些操作,这样当有人调用未定义的方法时,获取方法的名称并根据方法名称执行某些操作吗?并且,这可能用另一种语言(不是编译器)吗?如果这是可能的,它是如何被称为(理论上讲)?
答案 0 :(得分:4)
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
现在而不是错误,您将获得输出到您的控制台。