Moje pytanie jest podobne do „ Jaka jest różnica między włączaniem i rozszerzaniem w Ruby? ”.
Jaka jest różnica między require
i include
w Ruby? Jeśli chcę po prostu używać metod z modułu w mojej klasie, czy powinienem require
to czy include
nie?
require
iinclude
, a także stosowne,Module#append_features
.Odpowiedzi:
Źródło
Więc jeśli chcesz po prostu użyć modułu, zamiast go rozszerzyć lub zrobić wtyczkę, to zechcesz użyć
require
.Co dziwne, Ruby
require
jest analogiczna do C użytkownikainclude
, podczas gdy Rubyinclude
ma prawie nic jak C użytkownikainclude
.źródło
include
w Ruby jest po prostu dziedziczenie.class C; include M end
tworzyM
nadklasęC
i (dawną) nadklasęC
nadklasy zM
. Nie sądzę, że Cinclude
działa poprzez dziedziczenie, myślę, że jest to proste podstawienie tekstowe / leksykalne.Jeśli używasz modułu, oznacza to, że wprowadzasz wszystkie metody do swojej klasy. Jeśli jesteś
extend
klasą z modułem, oznacza to, że „wprowadzasz” metody modułu jako metody klasowe . Jeśli jesteśinclude
klasą z modułem, oznacza to, że „wprowadzasz” metody modułu jako metody instancji .DAWNY:
B.say
=> niezdefiniowana metoda „powiedzieć” dla B: KlasaB.new.say
=> to jest moduł A.C.say
=> to jest moduł A.C.new.say
=> niezdefiniowana metoda „say” dla C: Classźródło
require
iinclude
są.Z książki Ruby Metaprogramming,
źródło
Ruby
require
bardziej przypomina „włącz” w innych językach (takich jak C). Mówi Ruby, że chcesz wprowadzić zawartość innego pliku . Podobne mechanizmy w innych językach to:using <namespace>
dyrektywa w C # .import <package>
w Javie .Ruby
include
jest zorientowanym obiektowo mechanizmem dziedziczenia stosowanym dla mixin .Istnieje dobre wytłumaczenie tutaj :
Podkreślenie dodane.
źródło
Czy próbowałeś kiedyś
require
modułu? Jakie były wyniki? Spróbuj:Moduły nie mogą być wymagane, tylko zawarte!
źródło
TypeError
), jeśli słowoModule
zostanie zmienione naClass
.Od programowania Ruby 1.9
źródło
Uwzględnij Kiedy dołączasz moduł do swojej klasy, jak pokazano poniżej, to tak, jakbyś wziął kod zdefiniowany w module i wstawił go do klasy, gdzie „dołączasz” go. Umożliwia zachowanie „mieszania”. Służy do OSUSZANIA kodu, aby uniknąć powielania, na przykład, jeśli istnieje wiele klas, które potrzebują tego samego kodu w module.
Załaduj Metoda ładowania jest prawie podobna do metody wymagającej, ale nie śledzi, czy biblioteka została załadowana. Możliwe jest więc wielokrotne ładowanie biblioteki, a także przy użyciu metody ładowania należy podać rozszerzenie „.rb” nazwy pliku biblioteki.
Wymagaj Metoda wymaga pozwala załadować bibliotekę i zapobiega jej ładowaniu więcej niż jeden raz. Wymagana metoda zwróci „fałsz”, jeśli spróbujesz załadować tę samą bibliotekę po raz pierwszy. Metodę wymaganą należy zastosować tylko wtedy, gdy ładowana biblioteka jest zdefiniowana w osobnym pliku, co zwykle ma miejsce.
Możesz preferować ten http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/
źródło
Poniżej kilka podstawowych różnic między wymaganiem i obejmują:
Wymagać:
Zawierać:
źródło
Zwróci bolean true / false
Nazwa, która jest przekazywana jako parametr do wymaganej, ruby spróbuje znaleźć plik źródłowy o tej nazwie w ścieżce ładowania. Wymagana metoda zwróci „fałsz”, jeśli spróbujesz załadować tę samą bibliotekę po raz pierwszy. Wymaganej metody należy użyć tylko wtedy, gdy ładowana biblioteka jest zdefiniowana w osobnym pliku. Śledzi więc, czy ta biblioteka została już załadowana, czy nie.
Załóżmy, że masz jakieś metody, które musisz mieć w dwóch różnych klasach. Nie musisz pisać ich w obu klasach. Zamiast tego możesz to zdefiniować w module. A następnie dołącz ten moduł do innych klas. Jest on zapewniany przez Ruby tylko w celu zapewnienia zasady DRY. Służy do OSUSZANIA kodu, aby uniknąć powielania
źródło
Zawierać
Wymagać
Śledzi więc, czy ta biblioteka została już załadowana, czy nie. Nie musisz także określać rozszerzenia „.rb” nazwy pliku biblioteki. Oto przykład, w jaki sposób używać wymaga. Umieść wymaganą metodę na samej górze pliku „.rb”:
Załaduj
Poszerzać
źródło
„Ładuj” - wstawia zawartość pliku (parsuj plik za każdym razem, gdy plik jest wywoływany)
„Wymagaj” - wstawia przeanalizowany plik. (Plik przeanalizowano raz i zapisano w pamięci)
„Uwzględnij” - włącza moduł do klasy i może wykorzystywać metody wewnątrz modułu jako metodę instancji klasy
„Rozszerz” - włącza moduł do klasy i może wykorzystywać metody wewnątrz modułu jako metody klasy
źródło