在ruby上,为什么包括私有和扩展是公共的?

Vla*_*anu 11 ruby language-design metaprogramming access-specifier

在红宝石上,include私有的原因是什么,而Object#extend公众呢?

Jör*_*tag 10

Object#extend 是公开的,否则你将无法使用它.毕竟,它的目的是将一个模块混合到一个对象中,所以你通常称之为obj.extend(Foo),这是私有方法无法实现的.

Module#include 通常只在模块体内使用,如下所示:

class Bar
  include Foo
end
Run Code Online (Sandbox Code Playgroud)

即通常在没有接收器的情况下调用它,因此它不必是公开的.当然,它不具有成为私人无论是.

我猜测它是私有的原因是它更具侵入性,因为它改变了每个实例的行为Bar,而Object#extend只改变了一个对象.因此,Module#include在某种意义上说"更危险",因此是私人的.

我不知道这是否是实际原因,但它与其他类似的方法一致Module#define_method.

  • 快进到2014.`模块#include`(和`Module #prepend`)在v2.1中公开. (5认同)