在 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 上定义的名为 publicprivateprotected 的方法(或者至少我的 search-fu 没有找到他们)。

> Object.respond_to?(:public)
=> false 

【问题讨论】:

【参考方案1】:

确实有一个方法叫public,不过是在Module上定义的。这没关系,因为ObjectClass 的一个实例,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' 的含义的主要内容,如果未能解决你的问题,请参考以下文章

在Ruby中用\'替换'?

java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)

如何调用public void(int i,string s)

在Ruby中用正则表达式拆分字符串

如何在 ruby​​ on rails 中编写嵌套查询?

我想在jsp页面中用js获取s:property中的value要怎么办