关于ruby,include
是私有的,而Object#extend
是公开的,是什么原因?
答案 0 :(得分:10)
Object#extend
已公开,否则您将无法使用它。毕竟,它的目的是将一个模块混合到一个对象中,所以你通常称之为obj.extend(Foo)
,这是私有方法无法实现的。
Module#include
通常只在模块体内使用,如下所示:
class Bar
include Foo
end
即。它通常在没有接收器的情况下被调用,因此它不必是公开的。当然, 也不是私有的。
我的猜测是私有的原因是它更具侵入性,因为它改变了 Bar
的每个实例的行为,而Object#extend
只改变了单个对象。因此,Module#include
在某种意义上“更危险”,因此被私有化。
我不知道这是否是实际原因,但它与Module#define_method
等其他类似方法一致。
答案 1 :(得分:1)
能够在任何时候运行Foo.include(Bar)
很可能是一个非常讨厌的错误来源。
答案 2 :(得分:1)
为了补充JörgWMittag的答案,Object#extend还可以用于包含要在类级别使用的模块实例方法(也可用于该类的所有实例):
module Foo
def bar (baz)
end
end
class Qux
extend Foo
bar 'asdf'
end