我知道在Ruby中,我可以使用respond_to?检查一个对象是否有特定的方法。
但是,给定类,我如何检查实例是否有特定的方法?
比如,就像
Foo.new.respond_to?(:bar)
但我觉得肯定有比实例化一个新实例更好的方法。
我知道在Ruby中,我可以使用respond_to?检查一个对象是否有特定的方法。
但是,给定类,我如何检查实例是否有特定的方法?
比如,就像
Foo.new.respond_to?(:bar)
但我觉得肯定有比实例化一个新实例更好的方法。
当前回答
在我使用ruby 2.5.3的情况下,下面的句子已经完美地工作了:
value = "hello world"
value.methods.include? :upcase
它将返回一个布尔值true或false。
其他回答
实际上,这并不适用于对象和类。
这样做:
class TestClass
def methodName
end
end
根据给出的答案,这是可行的:
TestClass.method_defined? :methodName # => TRUE
但这并不管用:
t = TestClass.new
t.method_defined? : methodName # => ERROR!
所以我对类和对象都使用这个:
类:
TestClass.methods.include? 'methodName' # => TRUE
对象:
t = TestClass.new
t.methods.include? 'methodName' # => TRUE
而respond_to ?只对公共方法返回true,检查类上的“方法定义”也可能属于私有方法。
在Ruby v2.0+上,可以使用
Foo.private_instance_methods.include?(:bar) || Foo.instance_methods.include?(:bar)
试试Foo.instance_methods.include ?:酒吧
在我使用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。