接受所有方法名称并将其打印出来的对象

时间:2018-03-03 13:28:13

标签: ruby

我想创建一个接受方法名称并将其打印出来的对象。我应该可以调用任何方法。例如,

obj.hello("was")
# => called hello with argument 'was'

obj.ok(["df", 1])
# => called ok with argument ["df", 1]

我不想提前定义hellook

这可能吗?

1 个答案:

答案 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