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
- 1. Co to jest publiczne, prywatne i chronione w programowaniu obiektowym?
- 2. OpenSSL RSA prywatne i publiczne klucze
- 3. Czy publiczne i prywatne mają wpływ na układ pamięci obiektu?
- 4. Kopiowanie konstruktora powinno być prywatne lub publiczne
- 5. jak publiczne jest publiczne repozytorium github?
- 6. Clojure, defn, defn-, publiczne/prywatne, domyślnie
- 7. Czy Heroku Git Repo jest publiczne?
- 8. Czy plik .pem zawiera klucze prywatne i publiczne?
- 9. Interfejs API linii papilarnych z Androidem i klucze prywatne/publiczne
- 10. Git prywatne i publiczne repo dla tego samego projektu
- 11. Dlaczego opóźnienie ping Google Publiczne DNS (8.8.8.8) jest tak niskie?
- 12. Szyfrowanie prywatne/publiczne w Pythonie z biblioteką standardową
- 13. publiczne lub prywatne, to naprawdę ważne ze zmiennymi Android
- 14. Dlaczego WSZYSTKO jest instancją klasy w Ruby?
- 15. Dlaczego w Ruby jest zastąpiony ciąg #?
- 16. Dlaczego nie jest obecny katalog na mojej ścieżce Ruby?
- 17. Czy możliwe jest uwzględnienie właściwości nadrzędnych w rozszerzonej klasie Sass?
- 18. Pole struct jest prywatne podczas importowania modułu
- 19. Czy możliwe jest uwzględnienie podwójnej tabeli w zapytaniu o dołączenie
- 20. Dlaczego Resharper chce wielbłąda-case także prywatne metody?
- 21. Co to jest rozszerzenie klasy?
- 22. . Rozszerzenie akcji ... co to jest?
- 23. Dlaczego warto zastąpić prywatne dziedziczenie?
- 24. Czy możliwe jest rozszerzenie pojedynczego obiektu w Smalltalk
- 25. Publiczne metody statyczne a metody publiczne
- 26. Emacs wcięcie w trybie ruby prywatne
- 27. Jaki jest priorytet ~ i dlaczego?
- 28. co jest średnią * i spłaszczyć w Ruby
- 29. Gdzie jest "Gemfile" w Ruby?
- 30. Jaka jest różnica między Ruby i Ruby w Rails?
Dziękuję Ci za Twoje odpowiedzi! –