我想创建一个接受方法名称并将其打印出来的对象。我应该可以调用任何方法。例如,
obj.hello("was")
# => called hello with argument 'was'
obj.ok(["df", 1])
# => called ok with argument ["df", 1]
我不想提前定义hello
或ok
。
这可能吗?
答案 0 :(得分:6)
易:
class Noop
def method_missing(m, *args)
puts "#{m} #{args.inspect}"
end
end
Noop.new.foo
# => foo []
Noop.new.bar(1,2,3)
# => bar [1, 2, 3]
当您调用不存在的方法时,会在每个Ruby对象上调用 method_missing
。它通常最终由Object(所有东西的超类)处理,它引发NoMethodError
。
请注意,这不适用于其祖先(类,模块,对象,内核,BasicObject)提供的方法,您可以通过以下方法检查:
class Noop
puts self.instance_methods.inspect
puts self.methods.inspect
def method_missing(m, *args)
puts "#{m} #{args.inspect}"
end
end