response_to可能不是那么明显吗?在红宝石中工作。 考虑一下:
class A
def public_method
end
protected
def protected_method
end
private
def private_method
end
end
obj = A.new
obj.respond_to?(:public_method)
# true - that's pretty obvious
obj.respond_to?(:private_method)
# false - as expected
obj.respond_to?(:protected_method)
# true - WTF?
因此,如果'obj'响应protected_method我们应该期待
obj.protected_method
不要提出例外,我们不应该吗?
......但它明显提升
调用respond_to的文档点?第二个参数设置为true也检查私有方法
obj.respond_to?(:private_method, true)
# true
这更合理
所以问题是如何检查对象是否只响应公共方法? 有没有比这更好的解决方案?
obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
答案 0 :(得分:12)
如果obj响应给定方法,则返回true。私人和 受保护的方法仅在可选时包含在搜索中 第二个参数的计算结果为真
撰写问题时(Ruby 1.8.7):
如果obj响应给定方法,则返回true。仅当可选的第二个参数的计算结果为true时,才会在搜索中包含私有方法。
答案 1 :(得分:8)
如果respond_to?
应该寻找受保护的方法(检查this issue)
Matz已经声明它可能会在Ruby 2.0中发生变化。
注意某些类可能会使用#method_missing
并专门化#respond_to?
(或者更好地通过在Ruby 1.9.2 +中指定#respond_to_missing?
),在这种情况下,您的obj.methods.include?
将不会是可靠的。