2010-11-18 11 views

Odpowiedz

10

Object#extendma być publiczne, w przeciwnym razie nie będzie w stanie z niego korzystać. W końcu jego celem jest mieszanie modułu w obiekt, więc ogólnie nazywa się to jako obj.extend(Foo), co nie jest możliwe w przypadku metod prywatnych.

Module#include zwykle stosuje się tylko w środku korpusu modułu, tak jak poniżej:

class Bar 
    include Foo 
end 

Tj zwykle jest wywoływana bez odbiornika, więc nie musi być publiczna. Oczywiście, nie ma ona również wartości prywatnej.

Moje przypuszczenie jest powód, dlaczego to jest prywatna jest to, że jest bardziej inwazyjne, ponieważ zmienia zachowanie każdy Instancji Bar, natomiast Object#extend zmienia się tylko jeden obiekt. Dlatego też, Module#include jest w pewnym sensie "bardziej niebezpieczny", a zatem staje się prywatny.

Nie wiem, czy to jest faktyczny powód, ale jest zgodny z innymi podobnymi metodami, takimi jak Module#define_method.

+0

Nie * ma * być. Będziesz mógł go użyć, jeśli jest prywatny: 'obj.send (: extend, Foo)', 'obj.instance_eval {extend Foo}', nie uwzględniając przypadku modułów 'class Bar; przedłużyć Foo; end' –

+0

@ Marc-AndréLafortune: Lub 'class << obj; przedłużyć Foo; koniec ", oczywiście. Tak jak powiedziałem, to tylko domysły. –

+0

Odpowiedziałem na twoje pierwsze zdanie "Object # extend" musi być publiczne, inaczej nie będziesz mógł go użyć. " –

1

Aby móc uruchomić Foo.include(Bar) w dowolnym momencie, najprawdopodobniej byłaby źródłem bardzo nieprzyjemnych błędów.

1

celu uzupełnienia odpowiedź Jörga W MITTAG, w obiektu # przedłużenia mogą być również stosowane jako obejmujące sposoby instancji moduł, który ma być stosowany na poziomie klasy (który będzie również dostęp do wszystkich przypadkach w tej grupie):

module Foo 
    def bar (baz) 
    end 
end 

class Qux 
    extend Foo 

    bar 'asdf' 
end 
Powiązane problemy