Na ruby, co jest przyczyną include
jest prywatne, a Object#extend
jest publiczne?Na ruby, dlaczego uwzględnienie jest prywatne i rozszerzenie jest publiczne?
Odpowiedz
Object#extend
ma 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
.
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' –
@ Marc-AndréLafortune: Lub 'class << obj; przedłużyć Foo; koniec ", oczywiście. Tak jak powiedziałem, to tylko domysły. –
Odpowiedziałem na twoje pierwsze zdanie "Object # extend" musi być publiczne, inaczej nie będziesz mógł go użyć. " –
Aby móc uruchomić Foo.include(Bar)
w dowolnym momencie, najprawdopodobniej byłaby źródłem bardzo nieprzyjemnych błędów.
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
Dziękuję Ci za Twoje odpowiedzi! –