Ruby 对象,该对象接受所有方法名并将其打印出来

Ruby 对象,该对象接受所有方法名并将其打印出来,ruby,Ruby,我想创建一个接受方法名并将其打印出来的对象。我应该能够调用它的任何方法。比如说, obj.hello("was") # => called hello with argument 'was' obj.ok(["df", 1]) # => called ok with argument ["df", 1] 我不想预先定义hello或ok 这可能吗?简单: class Noop def method_missing(m, *args) puts "#{m} #{args.

我想创建一个接受方法名并将其打印出来的对象。我应该能够调用它的任何方法。比如说,

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

obj.ok(["df", 1])
# => called ok with argument ["df", 1]
我不想预先定义
hello
ok

这可能吗?

简单:

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对象调用
方法\u 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
简单:

调用不存在的方法时,会对每个Ruby对象调用
方法\u 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

对象是否也可能以任何方式进行真正的打印<例如,code>Noop.new.dup没有。我不确定我是否了解你@StefanPochmann
Noop.new.dup.bar(1,2,3)
将打印出
bar[1,2,3]
Noop.new.dup
不会打印任何内容,因为
dup
方法是由一个超类(我认为是对象)提供的。是的
dup
不这样做,因为它没有丢失是我的意思。这可以改变吗?我不确定您是否可以在不重新定义Object提供的所有方法的情况下对它们进行彻底的修改。您可以使用
self.methods
self.instance_方法
获取所有方法,并使用元编程对它们进行重新定义,但这会给您一个对象,它的行为与ruby语言中的任何其他对象都不一样,因此即使在空对象模式下也很少执行。因此,是的,它可能是@StefanPochmann,它只是不太有用。是否也有可能对象真的为任何方法进行打印<例如,code>Noop.new.dup没有。我不确定我是否了解你@StefanPochmann
Noop.new.dup.bar(1,2,3)
将打印出
bar[1,2,3]
Noop.new.dup
不会打印任何内容,因为
dup
方法是由一个超类(我认为是对象)提供的。是的
dup
不这样做,因为它没有丢失是我的意思。这可以改变吗?我不确定您是否可以在不重新定义Object提供的所有方法的情况下对它们进行彻底的修改。您可以使用
self.methods
self.instance_方法
获取所有方法,并使用元编程对它们进行重新定义,但这会给您一个对象,它的行为与ruby语言中的任何其他对象都不一样,因此即使在空对象模式下也很少执行。因此,是的,它可能是@StefanPochmann,它不是很有用。你遇到问题的代码是什么?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们有什么不同?请提供一个。你能提供你想要发生的事情的精确说明吗,包括任何和所有规则、这些规则的例外情况、拐角情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出,以演示在正常情况下,以及在所有异常、拐角情况、特殊情况、边界情况和边缘情况下,您预期会发生什么?请同时确保提供一个“我想创建一个对象,它接受变量方法名[…]”,您可以通过编写一个程序来实现这一点。如果您的程序有问题,请仔细阅读您正在使用的所有方法、类、模块和库的文档,为您的程序编写测试,用笔和纸跟踪执行情况,在调试器中单步执行,然后对其进行休眠,从头开始,再次休眠,然后,也只有这样,才能将你的问题缩小到一个简洁、集中、简单、简短、可重复的范围,并提出一个具体、集中、狭窄的问题。此外,请阅读以理解为什么“是否可能”是一个糟糕的问题,并且很可能是一个离题的问题,并相应地编辑你的问题,以包括你所遇到的确切问题,您为解决此问题而采取的步骤,以及您的。您遇到问题的代码是什么?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们有什么不同?请提供一个。你能提供你想要发生的事情的精确说明吗,包括任何和所有规则、这些规则的例外情况、拐角情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出,以演示在正常情况下,以及在所有异常、拐角情况、特殊情况、边界情况和边缘情况下,您预期会发生什么?请同时确保提供一个“我想创建一个对象,它接受变量方法名[…]”,您可以通过编写一个程序来实现这一点。如果您的程序有问题,请仔细阅读您正在使用的所有方法、类、模块和库的文档,为您的程序编写测试,用笔和纸跟踪执行情况,在调试器中单步执行,然后在调试器中休眠,然后从