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.