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

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

比如,就像

Foo.new.respond_to?(:bar)

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


当前回答

如果你正在检查一个对象是否可以响应一系列的方法,你可以这样做:

methods = [:valid?, :chase, :test]

def has_methods?(something, methods)
  methods & something.methods == methods
end

方法等等。方法将在它们的公共/匹配元素上连接两个数组。某物Methods包含你要检查的所有方法,它等于Methods。例如:

[1,2] & [1,2,3,4,5]
==> [1,2]

so

[1,2] & [1,2,3,4,5] == [1,2]
==> true

在这种情况下,你会想要使用符号,因为当你调用。methods时,它会返回一个符号数组,如果你使用["my", "methods"],它会返回false。

其他回答

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

class Foo
 def self.fclass_method
 end
 def finstance_method
 end
end

foo_obj = Foo.new
foo_obj.class.methods(false)
=> [:fclass_method] 

foo_obj.class.instance_methods(false)
=> [:fclass_method] 

希望这对你有所帮助!

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

value = "hello world"

value.methods.include? :upcase

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

如果你正在检查一个对象是否可以响应一系列的方法,你可以这样做:

methods = [:valid?, :chase, :test]

def has_methods?(something, methods)
  methods & something.methods == methods
end

方法等等。方法将在它们的公共/匹配元素上连接两个数组。某物Methods包含你要检查的所有方法,它等于Methods。例如:

[1,2] & [1,2,3,4,5]
==> [1,2]

so

[1,2] & [1,2,3,4,5] == [1,2]
==> true

在这种情况下,你会想要使用符号,因为当你调用。methods时,它会返回一个符号数组,如果你使用["my", "methods"],它会返回false。

试试Foo.instance_methods.include ?:酒吧