11

ruby では、パブリックであるのincludeにプライベートである理由は何ですか?Object#extend

4

3 に答える 3

10

Object#extend 公開する必要があります。公開しないと使用できません。結局のところ、その目的はモジュールをオブジェクトに混在させることなので、通常は のように呼び出しますがobj.extend(Foo)、これはプライベート メソッドでは不可能です。

Module#include通常、次のようにモジュール本体内でのみ使用されます。

class Bar
  include Foo
end

つまり、通常はレシーバーなしで呼び出されるため、パブリックである必要はありません。もちろん、プライベートである必要もありません。

私の推測では、それが非公開である理由は、単一のオブジェクトのみを変更するのに対し、のすべてのインスタンスの動作を変更するため、より侵襲的であるということです。したがって、ある意味で「より危険」であり、非公開にされています。BarObject#extendModule#include

それが本当の理由かどうかはわかりませんが、 のような他の同様の方法と一致していますModule#define_method

于 2010-11-18T13:11:45.040 に答える
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 に答える
1

Foo.include(Bar)いつでも実行できるようにすると、非常に厄介なバグの原因となる可能性が高くなります。

于 2010-11-18T14:48:15.367 に答える