2

我想做点什么,但不确定是否可行。如果调用了某些方法但未定义,我想使用“通用方法”或“默认方法”。这是一个简单的示例,因此您可以理解我的观点:

这是课程:

class XYZ

    def a
        #...
    end

    def b
        #...
    end
end

XYZ 类的实例:

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

如您所见,我正在调用未定义的方法“c”,它将引发错误。我可以在类 XYZ 中做某事,因此当有人调用未定义的方法时,获取该方法的名称并根据该方法的名称做某事?而且,这在其他语言中是否可能(不制作编译器)?如果这是可能的,它怎么称呼(理论上)?

4

2 回答 2

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"

您还应该定义在 1.9.2+ 中更好地工作respond_to_missing?respond_to?你应该阅读更多关于respond_to?/respond_to_missing?使用时method_missing.

顺便说一句,这将被认为是元编程。这在编译语言中通常是不可能的,因为它们调用函数的方式。

于 2012-05-23T18:26:49.027 回答
3

它称为method_missing。当您调用未在对象上定义的方法时,ruby 会将调用重定向到 method_missing 方法,这会为您引发错误。

你可以这样做:

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

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

于 2012-05-23T18:28:00.523 回答