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