在 Ruby 中用 ':public' 调用 'send' 的含义
Posted
技术标签:
【中文标题】在 Ruby 中用 \':public\' 调用 \'send\' 的含义【英文标题】:The meaning of calling 'send' with ':public' in Ruby在 Ruby 中用 ':public' 调用 'send' 的含义 【发布时间】:2016-01-27 10:27:03 【问题描述】:在 Ruby 中,你可以做...
Object.send(:public, *Object.private_instance_methods)
...如this answer to another question 所示。这重新定义了Object
的每个私有实例方法,将它们公开。我的问题是:这是如何工作的? send
应该与方法的名称一起使用,但似乎没有在 Object
上定义的名为 public
、private
或 protected
的方法(或者至少我的 search-fu 没有找到他们)。
> Object.respond_to?(:public)
=> false
【问题讨论】:
【参考方案1】:确实有一个方法叫public
,不过是在Module
上定义的。这没关系,因为Object
是Class
的一个实例,Class
的超类是Module
:除了 ruby 类层次结构中的轻微循环之外,这只是普通的 ruby 继承。
您的 respond_to?
检查返回 false,因为默认情况下 respond_to?
不检查受保护或私有方法(在 ruby 2.0 之前它检查受保护方法)。您可以通过以下方式请求搜索所有方法
Object.respond_to?(:public, true)
返回 true。
【讨论】:
有趣!此外,在进一步修补之后,我发现将 Object 的私有方法设为 public 并不会将 Module 中的混合方法设为 public。以上是关于在 Ruby 中用 ':public' 调用 'send' 的含义的主要内容,如果未能解决你的问题,请参考以下文章
java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)