响应?和受保护的方法

发布于 2024-08-27 04:41:38 字数 807 浏览 6 评论 0原文

怎么respond_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

It may not be so obvious how respond_to? works in ruby.
Consider that:


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?

So if 'obj' responds to protected_method we should expect

obj.protected_method

not to raise an exception, shouldn't we?

...but it raises obviously

Documentation points that calling respond_to? with 2nd argument set to true check private method as well

obj.respond_to?(:private_method, true)
# true

And that's far more reasonable

So the question is how to check if object responds to public method only?
Is there a solution better than that?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

栖迟 2024-09-03 04:41:38

来自文档

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


当问题被写入时(Ruby 1.8.7):

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

From the documentation:

Returns true if obj responds to the given method. Private and
protected methods
are included in the search only if the optional
second parameter evaluates to true

When the question was written (Ruby 1.8.7):

Returns true if obj responds to the given method. Private methods are included in the search only if the optional second parameter evaluates to true.

爱的故事 2024-09-03 04:41:38

目前正在争论 respond_to? 是否应该查找受保护的方法(检查 这个问题

Matz 表示它可能会在 Ruby 2.0 中改变。

请注意,某些类可能使用 #method_missing 并专门化 #respond_to?(或者在 Ruby 1.9.2+ 中指定 #respond_to_missing? 更好),在这种情况下,您的 obj.methods.include? 将不可靠。

It is under debate if respond_to? should look for protected methods or not (check this issue)

Matz has stated that it will probably change in Ruby 2.0.

Note some classes might use #method_missing and specialize #respond_to? (or better by specify a #respond_to_missing? in Ruby 1.9.2+), in which case your obj.methods.include? will not be reliable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文