ruby では、パブリックであるのinclude
にプライベートである理由は何ですか?Object#extend
3 に答える
Object#extend
公開する必要があります。公開しないと使用できません。結局のところ、その目的はモジュールをオブジェクトに混在させることなので、通常は のように呼び出しますがobj.extend(Foo)
、これはプライベート メソッドでは不可能です。
Module#include
通常、次のようにモジュール本体内でのみ使用されます。
class Bar
include Foo
end
つまり、通常はレシーバーなしで呼び出されるため、パブリックである必要はありません。もちろん、プライベートである必要もありません。
私の推測では、それが非公開である理由は、単一のオブジェクトのみを変更するのに対し、のすべてのインスタンスの動作を変更するため、より侵襲的であるということです。したがって、ある意味で「より危険」であり、非公開にされています。Bar
Object#extend
Module#include
それが本当の理由かどうかはわかりませんが、 のような他の同様の方法と一致していますModule#define_method
。
Jörg W Mittag の回答を補足するために、 Object#extend を使用して、クラス レベルで使用されるモジュールのインスタンス メソッドを含めることもできます (これは、そのクラスのすべてのインスタンスでも使用できます)。
module Foo
def bar (baz)
end
end
class Qux
extend Foo
bar 'asdf'
end
Foo.include(Bar)
いつでも実行できるようにすると、非常に厄介なバグの原因となる可能性が高くなります。