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

时间:2010-11-18 10:34:12

标签: ruby metaprogramming language-design access-specifier

关于ruby,include是私有的,而Object#extend是公开的,是什么原因?

3 个答案:

答案 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