在Ruby中,使用':public'调用'send'的含义是什么?

4

在Ruby中,你可以执行...

Object.send(:public, *Object.private_instance_methods)

...如同另一个问题的答案中所述。这种方式重新定义了Object类的每个私有实例方法,使它们变成公共的。我的问题是:这是如何工作的?send应该使用方法名称,但似乎在Object上没有定义名为publicprivateprotected的方法(或者至少我的搜索未找到它们)。

> Object.respond_to?(:public)
=> false 
1个回答

4

确实有一种名为public的方法,但它是在Module中定义的。这是可以的,因为ObjectClass的一个实例,而Class的超类是Module:除了在 ruby 类层次结构启动时存在轻微循环外,这只是普通的 ruby 继承。

您的respond_to?检查返回false,因为默认情况下respond_to?不会检查受保护或私有方法(在ruby 2.0之前,它会检查受保护的方法)。您可以通过执行以下操作来请求搜索所有方法:

Object.respond_to?(:public, true)

这确实返回true。


有趣!此外,经过进一步的调试,我发现将Object的私有方法公开并不会使来自Module的混入方法公开。 - Pathogen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接