我知道在Ruby中,我可以使用respond_to?检查一个对象是否有特定的方法。
但是,给定类,我如何检查实例是否有特定的方法?
比如,就像
Foo.new.respond_to?(:bar)
但我觉得肯定有比实例化一个新实例更好的方法。
我知道在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。
其他回答
“给定一个类,看看实例是否有方法(Ruby)”的答案更好。显然Ruby内置了这个功能,但我不知何故忽略了它。不管怎样,我的答案留作参考。
Ruby类响应instance_methods和public_instance_methods方法。在Ruby 1.8中,第一个函数以字符串数组的形式列出所有实例方法名,第二个函数将其限制为公共方法。第二个行为是您最可能想要的,因为respond_to?默认情况下,也将自身限制为公共方法。
Foo.public_instance_methods.include?('bar')
但是在Ruby 1.9中,这些方法返回符号数组。
Foo.public_instance_methods.include?(:bar)
如果您计划经常这样做,您可能希望扩展Module以包含一个快捷方法。(将它分配给Module而不是Class可能看起来很奇怪,但由于instance_methods方法位于模块中,所以最好保持这种模式。)
class Module
def instance_respond_to?(method_name)
public_instance_methods.include?(method_name)
end
end
如果您希望同时支持Ruby 1.8和Ruby 1.9,那么在这里添加搜索字符串和符号的逻辑也很方便。
在我使用ruby 2.5.3的情况下,下面的句子已经完美地工作了:
value = "hello world"
value.methods.include? :upcase
它将返回一个布尔值true或false。
试试Foo.instance_methods.include ?:酒吧
如果你正在检查一个对象是否可以响应一系列的方法,你可以这样做:
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。
你可以使用method_defined?如下:
String.method_defined? :upcase # => true
比instance_methods.include?其他人似乎都在建议。
请记住,你不会知道一个类是否动态响应一些调用method_missing,例如通过重新定义respond_to?,或者从Ruby 1.9.2开始定义respond_to_missing?。