我知道在Ruby中,我可以使用respond_to?检查一个对象是否有特定的方法。

但是,给定类,我如何检查实例是否有特定的方法?

比如,就像

Foo.new.respond_to?(:bar)

但我觉得肯定有比实例化一个新实例更好的方法。


当前回答

试试Foo.instance_methods.include ?:酒吧

其他回答

klass.instance_methods。包括:method_name或"method_name",我认为这取决于Ruby版本。

我认为method_defined有问题?在Rails。它可能不一致或其他什么,所以如果你使用Rails,最好使用attribute_method?(attribute)中的东西。

测试method_defined?在ActiveRecord类上不工作,直到实例化”是一个关于不一致性的问题。

在我使用ruby 2.5.3的情况下,下面的句子已经完美地工作了:

value = "hello world"

value.methods.include? :upcase

它将返回一个布尔值true或false。

试试Foo.instance_methods.include ?:酒吧

你可以使用method_defined?如下:

String.method_defined? :upcase # => true

比instance_methods.include?其他人似乎都在建议。

请记住,你不会知道一个类是否动态响应一些调用method_missing,例如通过重新定义respond_to?,或者从Ruby 1.9.2开始定义respond_to_missing?。