我知道在Ruby中,我可以使用respond_to?检查一个对象是否有特定的方法。
但是,给定类,我如何检查实例是否有特定的方法?
比如,就像
Foo.new.respond_to?(:bar)
但我觉得肯定有比实例化一个新实例更好的方法。
我知道在Ruby中,我可以使用respond_to?检查一个对象是否有特定的方法。
但是,给定类,我如何检查实例是否有特定的方法?
比如,就像
Foo.new.respond_to?(:bar)
但我觉得肯定有比实例化一个新实例更好的方法。
当前回答
我认为method_defined有问题?在Rails。它可能不一致或其他什么,所以如果你使用Rails,最好使用attribute_method?(attribute)中的东西。
测试method_defined?在ActiveRecord类上不工作,直到实例化”是一个关于不一致性的问题。
其他回答
如果你正在检查一个对象是否可以响应一系列的方法,你可以这样做:
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 2.5.3的情况下,下面的句子已经完美地工作了:
value = "hello world"
value.methods.include? :upcase
它将返回一个布尔值true或false。
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]
希望这对你有所帮助!
klass.instance_methods。包括:method_name或"method_name",我认为这取决于Ruby版本。
我不知道为什么每个人都建议你应该使用instance_methods和include?当method_defined ?完成任务。
class Test
def hello; end
end
Test.method_defined? :hello #=> true
NOTE
如果你是从其他OO语言来的Ruby,或者你认为method_defined的意思是你显式定义的方法:
def my_method
end
然后读这个:
在Ruby中,模型上的属性基本上也是一个方法。所以method_defined ?对于属性也将返回true,而不仅仅是方法。
例如:
给定一个具有String属性first_name的类实例:
<instance>.first_name.class #=> String
<instance>.class.method_defined?(:first_name) #=> true
因为first_name既是一个属性也是一个方法(也是一个string类型的字符串)。