在Ruby中声明"私有"/"受保护"时实际发生了什么?

And*_*all 6 ruby access-specifier

在Ruby类定义中声明private/ 实际发生了什么protected?它们不是关键字,因此这意味着它们必须是方法调用,但我无法找到它们的定义位置.它们似乎没有记录.声明private/ protected方法的两种不同方式(如下所示)是否以不同方式实现?(第二种方式显然是方法调用,但这在第一种方式中并不那么明显.)

class Foo
  private
  def i_am_private; end
  def so_am_i; end
end

class Foo
  def i_am_private; end
  def so_am_i; end
  private :i_am_private, :so_am_i
end
Run Code Online (Sandbox Code Playgroud)

Zab*_*bba 9

两者都是方法调用.从文档引用:

每个功能可以以两种不同的方式使用.

  1. 如果不带参数使用,则这三个函数设置后续定义方法的默认访问控制.
  2. 使用参数,函数设置命名方法和常量的访问控制.

请参阅此处的文档

  1. Module.private
  2. 访问控制

您正在寻找该Module.private方法的存在方式.这是发生的地方.而这里是一些更多的信息了.你必须阅读更多内容,从rb_define_private_method定义中开始class.c.

希望有所帮助!