11

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

4

3 回答 3

10

Object#extend 必须是公开的,否则你将无法使用它。毕竟,它的目的是将模块混入对象中,因此您通常将其称为 like obj.extend(Foo),这对于私有方法是不可能的。

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

class Bar
  include Foo
end

即它通常在没有接收器的情况下被调用,因此它不必是公开的。当然,它也不必私有的。

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

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

于 2010-11-18T13:11:45.040 回答
1

能够Foo.include(Bar)在任何时候运行很可能是非常讨厌的错误的来源。

于 2010-11-18T14:48:15.367 回答
1

为了补充 Jörg W Mittag 的回答,Object#extend 也可用于包含要在类级别使用的模块实例方法(该类的所有实例也可以使用):

module Foo
  def bar (baz)
  end
end

class Qux
  extend Foo

  bar 'asdf'
end
于 2010-12-01T21:29:10.157 回答