Jaka jest różnica między include a require w Rubim?

Moje pytanie jest podobne do " Jaka jest różnica między include i extend w Rubim?".

Jaka jest różnica między require a include w Ruby? Jeśli chcę tylko użyć metod z modułu w mojej klasie, powinienem require to czy include to?

Author: Community, 2008-11-25

10 answers

Jaka jest różnica między "include" I "require" w Rubim?

Odpowiedź:

Metody include I require do bardzo różne rzeczy.

Metoda require robi to, co obejmuje czy w większości innych programów języki: Uruchom inny plik. To także śledzi to, czego potrzebujesz w przeszłość i nie wymaga tego samego pliku dwa razy. Aby uruchomić inny plik bez ta dodatkowa funkcjonalność, można użyć the load metoda.

Metoda include przyjmuje wszystkie metody z innego modułu i włącza je do bieżącego modułu. Jest to rzecz na poziomie językowym, jak w przeciwieństwie do rzeczy na poziomie plików, jak z wymagają. Metoda include jest podstawowy sposób "rozszerzania" zajęć z inne moduły (zwykle określane jako mieszanych). Na przykład, jeśli twoja klasa definiuje metodę "każdy", można Dołącz moduł Mixin i może działać jako zbiór. To może być mylące jako czasownik include jest stosowany bardzo różnie w innych języki.

Źródło

Więc jeśli po prostu chcesz użyć modułu, zamiast go rozszerzać lub mieszać, będziesz chciał użyć require.

Co dziwne, Ruby require jest analogiczne do C include, Podczas gdy Ruby include jest prawie niczym jak C include.
 501
Author: HanClinto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 15:47:54

Z Metaprogramowania Ruby book,

Metoda require() jest dość podobna do load(), ale jest przeznaczona dla inny cel. Używasz load() do wykonania kodu, i używasz require() aby zaimportować biblioteki.

 88
Author: Pratik Khadloya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-20 02:34:56

Jeśli używasz modułu, oznacza to, że wprowadzasz wszystkie metody do swojej klasy. Jeśli extend jest klasą z modułem, oznacza to, że" wprowadzasz " metody modułu jako metody class. Jeśli include jest klasą z modułem, oznacza to, że "wprowadzasz" metody modułu jako metody instancja.

EX:

 module A
   def say
     puts "this is module A"
   end
 end

 class B
   include A
 end

 class C
   extend A
 end

B.say => undefined method ' say ' for B: Class

B.new.say = > to jest moduł a

C.say = > to jest moduł A

C.new.say => undefined method ' say ' for C: Class

 83
Author: Peter Dang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-08 00:28:00
  • Ruby require jest bardziej podobny do "include" w innych językach (takich jak C). Mówi Ruby, że chcesz wprowadź zawartość innego pliku. Podobne mechanizmy w innych językach to:

  • Ruby includejest obiektowy mechanizm dziedziczenia używany dla mixinów.

Jest dobre wyjaśnienie tutaj :

[] prosta odpowiedź jest taka, że require i include są zasadniczo niezwiązane.

"require" jest podobne do include C, co może powodować zamieszanie dla początkujących. (Jedną zauważalną różnicą jest to, że miejscowi wewnątrz wymaganego pliku " odparowują" kiedy żądanie zostanie wykonane.)

Ruby include w niczym nie przypomina C include. Polecenie include "miesza w" moduł w klasę. To jest forma ograniczona z wielu dziedziczenie. Dołączony moduł dosłownie nadaje " is-a" związek na rzecz, w tym to.

Podkreślenie dodane.

 54
Author: bradheintz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:36

Próbowałeś kiedyś modułu? Jakie były wyniki? Po prostu spróbuj:

MyModule = Module.new
require MyModule # see what happens

Moduły nie mogą być wymagane, tylko dołączone!

 7
Author: Boris Stitnicky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-12 03:29:38

From Programowanie Ruby 1.9

Przedstawimy kilka uwag na temat Oświadczenia include zanim przejdziemy dalej. Po pierwsze, ma nie ma to nic wspólnego z plikami. Programiści C używają dyrektywy preprocesora o nazwie #include do Wstaw zawartość jednego pliku do drugiego podczas kompilacji. Instrukcja Ruby include po prostu odwołuje się do modułu. Jeśli moduł znajduje się w osobnym pliku, musisz użyć wymagać (lub jego rzadziej używanego kuzyna, load) przeciągnięcia tego pliku w przed użyciem Dołącz. Po drugie, Ruby include nie kopiuje po prostu metod instancji modułu do klasy. Zamiast tego tworzy odniesienie z klasy do dołączonego modułu. Jeśli wiele klas dołącz ten moduł, a wszystkie wskażą to samo. Jeśli zmienisz definicję metody w module, nawet gdy program jest uruchomiony, wszystkie klasy, które zawierają moduł pokaże nowe zachowanie.

 7
Author: cizixs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-25 01:48:46

Include 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. Pozwala na zachowanie "mieszania". Służy do wysuszania kodu, aby uniknąć powielania, na przykład, jeśli w module jest wiele klas, które potrzebowałyby tego samego kodu.

Load Metoda load jest prawie jak metoda require, ale nie śledzi, czy biblioteka została załadowany. Tak więc możliwe jest wielokrotne ładowanie biblioteki, a także przy użyciu metody load należy podać".RB " rozszerzenie nazwy pliku biblioteki.

Require Metoda require umożliwia załadowanie biblioteki i zapobiega jej załadowaniu więcej niż jeden raz. Metoda require zwróci "false", jeśli spróbujesz załadować tę samą bibliotekę po raz pierwszy. Metoda require musi być używana tylko wtedy, gdy ładowana Biblioteka jest zdefiniowana w osobnym pliku, który zwykle jest case.

You can prefer this http://ionrails.com/2009/09/19/ruby_require-vs-load-vs-include-vs-extend/

 2
Author: Sanket,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-27 10:16:21
require(name)

Zwróci bolean prawda / fałsz

Nazwa przekazywana jako parametr do require, ruby spróbuje znaleźć plik źródłowy o tej nazwie w twojej ścieżce ładowania. Metoda require zwróci "false", jeśli spróbujesz załadować tę samą bibliotekę po raz pierwszy. Metoda require musi być używana tylko wtedy, gdy ładowana Biblioteka jest zdefiniowana w osobnym pliku. Śledzi więc, czy biblioteka była już załadowana, czy nie.

include module_name

Załóżmy, że jeśli masz jakieś metody, które trzeba mieć w dwóch różnych klasach. Więc nie musisz ich pisać w obu klasach. Zamiast tego możesz to zdefiniować w module. A następnie włącz ten moduł do innych klas. Jest dostarczany przez Ruby tylko po to, aby zapewnić suchą zasadę. Służy do wysuszania kodu, aby uniknąć powielania

 2
Author: Shrinivas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 13:55:09

Include

Kiedy include moduł do swojej klasy, to tak, jakbyś wziął kod zdefiniowany w module i wstawiony do klasy, gdzie "włącz" to. Pozwala na zachowanie "mieszania". Służy do wysychania Twój kod, aby uniknąć powielania, na przykład, jeśli było wiele klasy, które potrzebowałyby tego samego kodu wewnątrz modułu.

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  include Log 
  # ... 
end

tc = TestClass.new.class_type # -> success
tc = TestClass.class_type # -> error

Require

Metoda require pozwala na załadowanie biblioteki i zapobiega ładowanie więcej niż raz. Metoda require zwróci "false", jeśli spróbuj załadować tę samą bibliotekę po raz pierwszy. The require metoda musi być używana tylko wtedy, gdy ładowana Biblioteka jest zdefiniowana w osobny plik, co zwykle ma miejsce.

Więc śledzi, czy biblioteka była już załadowana, czy nie. Nie musisz również określać".RB " rozszerzenie nazwy pliku biblioteki. Oto przykład użycia require. Miejsce wymagaj metody na samym szczycie".RB " plik:

Load

Metoda load jest prawie jak metoda require, ale nie śledź, czy biblioteka została załadowana, czy nie. Więc to możliwość wielokrotnego ładowania biblioteki, a także podczas korzystania z load metodę należy podać".RB " rozszerzenie nazwy pliku biblioteki.

Extend

Podczas używania metody extend zamiast include, dodajesz na metody modułu jako metody klasowe zamiast jako metody instancji.

module Log 
  def class_type
    "This class is of type: #{self.class}"
  end
end

class TestClass 
  extend Log 
  # ... 
end

tc = TestClass.class_type
 0
Author: Imran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-17 19:47:20

Poniżej kilka podstawowych różnic między require i include:

Require:

  1. Require odczytuje plik z systemu plików, przetwarza go, zapisuje do pamięci i uruchamia w danym miejscu, co oznacza, że jeśli w ogóle coś zmienisz podczas działania skryptu, to ta zmiana nie będzie odzwierciedlać.
  2. wymagamy pliku po nazwie, a nie po nazwie modułu.
  3. jest zwykle używany dla bibliotek i rozszerzeń.

Include:

  1. kiedy wpiszesz moduł do swojej klasy zachowuje się tak, jakbyś wziął kod zdefiniowany w module i wstawił go do swojej klasy.
  2. podajemy nazwę modułu, Nie nazwę pliku.
  3. jest zwykle używany do wyschnięcia kodu i usunięcia duplikacji w kodzie.
 0
Author: Awais Shafqat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-28 20:54:45