回应?和受保护的方法

mlo*_*cki 15 ruby encapsulation access-specifier

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?
Run Code Online (Sandbox Code Playgroud)

因此,如果'obj'响应protected_method,我们应该期待

obj.protected_method
Run Code Online (Sandbox Code Playgroud)

我不应该提出异常吗?

......但它明显提升了

调用respond_to的文档点?第二个参数设置为true也检查私有方法

obj.respond_to?(:private_method, true)
# true
Run Code Online (Sandbox Code Playgroud)

这更合理

所以问题是如何检查对象是否只响应公共方法?有没有比这更好的解决方案?

obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false
Run Code Online (Sandbox Code Playgroud)

wan*_*hao 12

文档:

如果obj响应给定方法,则返回true.仅当可选的第二个参数的计算结果为true时,才会在搜索中包含专用和受保护的方法

问题写完后(Ruby 1.8.7):

如果obj响应给定方法,则返回true.仅当可选的第二个参数的计算结果为true时,才会在搜索中包含私有方法.

  • 仍然是有价值的答案.我刚刚从Ruby`1.8.7`升级到Ruby`2.1.1`时发现了这个奇怪的错误. (2认同)

Mar*_*une 8

是否respond_to?应该寻找受保护的方法正在讨论中(请查看此问题)

Matz表示它可能会在Ruby 2.0中发生变化.

注意某些类可能会使用#method_missing和特化#respond_to?(或者更好地通过#respond_to_missing?在Ruby 1.9.2+中指定一个),在这种情况下,您obj.methods.include?将不可靠.