Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 你有什么反应?和受保护的方法_Ruby_Encapsulation_Access Specifier - Fatal编程技术网

Ruby 你有什么反应?和受保护的方法

Ruby 你有什么反应?和受保护的方法,ruby,encapsulation,access-specifier,Ruby,Encapsulation,Access Specifier,你的反应可能不那么明显?在ruby中工作。 考虑一下: 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?(:

你的反应可能不那么明显?在ruby中工作。 考虑一下:


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”响应受保护的方法,我们应该期待

obj.protected_method
我们不应该提出一个例外,不是吗

…但它显然提高了

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

obj.respond_to?(:private_method, true)
# true
这更合理

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

obj.methods.include?(:public_method)
# true
obj.methods.include?(:protected_method)
# false

关于
respond\u to?
是否应该寻找受保护的方法(检查)存在争议

Matz已经声明它可能会在Ruby 2.0中发生变化

注意:有些类可能使用
#method_missing
并专门化
#respond_to?
(或者更好地在Ruby 1.9.2+中指定
#respond_to_missing?
,在这种情况下,您的
对象方法。include?
将不可靠。

如果obj响应给定的方法,则返回true。私人和 受保护的方法仅当可选的 第二个参数的计算结果为true

编写问题时(Ruby 1.8.7):

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


我很难理解翻译日语,但无论如何都很好地知道Ruby Calp考虑这个问题。至少有一个可以使用Obj.class。PuxCudioMyType(:PosieCdType方法),它可以按预期工作,但不能处理单体方法,所以我认为,作为解决方案而不是真正的解决方案,问题是从2010。当时在Ruby 1.8.7中,文档指出:“如果obj响应给定的方法,则返回true>。只有当可选的第二个参数计算为true时,才会在搜索中包含私有方法。”这仍然是一个有价值的答案。我刚刚在将一个旧项目从Ruby
1.8.7
升级到Ruby
2.1.1
时发现了这个奇怪的bug。它现在启动了。