web-dev-qa-db-de.com

Was ist der Unterschied zwischen Include und Required in Ruby?

Meine Frage ist ähnlich wie " Was ist der Unterschied zwischen Include und Expand in Ruby? ".

Was ist der Unterschied zwischen require und include in Ruby? Wenn ich nur die Methoden eines Moduls in meiner Klasse verwenden möchte, sollte ich require oder include damit?

439
Owen

Was ist der Unterschied zwischen "Include" und "required" in Ruby?

Antworten:

Die Include- und Requirement-Methoden do sehr verschiedene Dinge.

Die Require-Methode macht was funktioniert in den meisten anderen Programmen Sprachen: Führen Sie eine andere Datei aus. Es auch verfolgt, was Sie in der Vergangenheit und erfordert nicht die gleiche Datei zweimal. Eine andere Datei ohne .__ ausführen. Mit dieser zusätzlichen Funktionalität können Sie .__ verwenden. die Lademethode.

Die Include-Methode nimmt alle Methoden aus einem anderen Modul und fügt sie in das aktuelle Modul ein . Dies ist eine Sache auf Sprachebene wie Im Gegensatz zu einer Sache auf Dateiebene wie bei benötigen. Die Include-Methode ist die Primärer Weg zum Erweitern von Klassen mit andere Module (normalerweise als Mix-Ins bezeichnet). Zum Beispiel, wenn Ihre Klasse Definiert die Methode "Each". Sie können Fügen Sie das Mixin-Modul Enumerable .__ ein. und es kann als Sammlung dienen. Diese kann als das Include-Verb verwirrend sein wird in anderen .__ sehr unterschiedlich verwendet. Sprachen.

Quelle

Wenn Sie also nur ein Modul verwenden möchten, anstatt es zu erweitern oder ein Mix-In durchzuführen, möchten Sie require verwenden.

Seltsamerweise ist Rubys require analog zu Cs include, während Rubys include fast nichts mit Cs include ist.

518
HanClinto

Aus dem Metaprogramm-Ruby-Buch 

Die require()-Methode ähnelt load(), ist jedoch für .__ gedacht. ein anderer Zweck. Sie verwenden load(), um Code auszuführen, und Sie verwenden ____. require() zum Importieren von Bibliotheken.

88
Pratik Khadloya

Wenn Sie ein Modul verwenden, müssen Sie alle Methoden in Ihre Klasse aufnehmen. Wenn Sie eine Klasse mit einem Modul extend haben, bedeutet dies, dass Sie die Methoden des Moduls als class Methods ..__ einbringen. Wenn Sie eine Klasse mit einem Modul include haben, bedeutet dies, dass Sie die Methoden des Moduls als Instanz Methoden "einführen".

EX:

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

 class B
   include A
 end

 class C
   extend A
 end

B.say => undefinierte Methode 'say' für B: Class

B.new.say => dies ist Modul A

C.say => dies ist Modul A

C.new.say => undefinierte Methode 'say' für C: Class

84
Peter Dang
  • Ruby require ist in anderen Sprachen (wie C) eher wie "include". Sie teilt Ruby mit, dass Sie den Inhalt einer anderen Datei einfügen möchten. Ähnliche Mechanismen in anderen Sprachen sind:

  • Ruby includeist ein objektorientierter Vererbungsmechanismus, der für Mixins verwendet wird.

Es gibt eine gute Erklärung hier :

[Die] einfache Antwort ist, dass erfordern und einschließen im Wesentlichen keinen Zusammenhang haben.

"Require" ähnelt dem C-Include, was zu Verwirrung bei Neulingen führen kann. (Ein bemerkenswerter Unterschied besteht darin, dass sich die Einheimischen in der erforderlichen Datei "verdunsten" Befinden, wenn die Anforderung erfüllt ist.)

Das Ruby include ist nicht mit dem C include vergleichbar. Die Include-Anweisung "mischt" ein Modul in eine Klasse ein. Es ist eine begrenzte Form der Mehrfachvererbung. Ein enthaltenes Modul verleiht buchstäblich ein "is-a" Beziehung zu der Sache einschließlich es.

Betonung hinzugefügt.

55
bradheintz

Von Programmieren von Ruby 1.9

Bevor wir weitermachen, werden wir einige Punkte zu der Include-Aussage machen. Erstens hat es nichts mit Dateien zu tun. C-Programmierer verwenden eine Präprozessor-Direktive namens #include für Fügen Sie während der Kompilierung den Inhalt einer Datei in eine andere ein. Die Ruby-Include-Anweisung macht einfach einen Verweis auf ein Modul. Wenn sich dieses Modul in einer separaten Datei befindet, müssen Sie .__ verwenden. erfordern (oder den weniger häufig verwendeten Cousin load), um diese Datei vor dem Verwenden von include ..__ zu ziehen. Zweitens kopiert ein Ruby-Include die Instanzmethoden des Moduls nicht einfach in die Klasse . Stattdessen verweist es von der Klasse auf das enthaltene Modul. Wenn mehrere Klassen das Modul enthalten, weisen sie alle auf dasselbe hin. Wenn Sie die Definition eines .__ ändern. Methode innerhalb eines Moduls, auch wenn Ihr Programm ausgeführt wird, alle Klassen, die das .__ enthalten. Modul zeigt das neue Verhalten.

7
cizixs

Haben Sie schon einmal versucht, ein Modul zu require? Was waren die Ergebnisse? Versuch's einfach:

MyModule = Module.new
require MyModule # see what happens

Module können nicht benötigt werden, nur enthalten!

7
Boris Stitnicky

Include Wenn Sie ein Modul wie unten gezeigt in Ihre Klasse aufnehmen, ist es, als ob Sie den in dem Modul definierten Code genommen und in die Klasse eingefügt haben, wo Sie ihn "einschließen". Es erlaubt das Mixin-Verhalten. Es wird verwendet, um Ihren Code zu DRY zu machen, um Duplizierungen zu vermeiden, zum Beispiel, wenn mehrere Klassen vorhanden sind, die denselben Code innerhalb des Moduls benötigen.

Load Die Lademethode ist fast wie die Required-Methode, es wird jedoch nicht nachverfolgt, ob die Bibliothek geladen wurde oder nicht. Es ist also möglich, eine Bibliothek mehrmals zu laden, und wenn Sie die Lademethode verwenden, müssen Sie die Erweiterung ".rb" des Bibliotheksdateinamens angeben.

Require Mit der Require-Methode können Sie eine Bibliothek laden und verhindern, dass diese mehrmals geladen wird. Die Required-Methode gibt "false" zurück, wenn Sie versuchen, dieselbe Bibliothek nach dem ersten Mal zu laden. Die Require-Methode muss nur verwendet werden, wenn die zu ladende Bibliothek in einer separaten Datei definiert ist. Dies ist in der Regel der Fall.

Sie können dies bevorzugen http://ionrails.com/2009/09/19/Ruby_require-vs-load-vs-include-vs-extend/

3
Sanket
require(name)

Es wird bolean true/false zurückgegeben

Der Name, der als Parameter an die Anforderung übergeben wird, versucht Ruby, die Quelldatei mit diesem Namen in Ihrem Ladepfad zu finden. Die Required-Methode gibt "false" zurück, wenn Sie versuchen, dieselbe Bibliothek nach dem ersten Mal zu laden. Die Anforderungsmethode muss nur verwendet werden, wenn die zu ladende Bibliothek in einer separaten Datei definiert ist. Damit wird überwacht, ob die Bibliothek bereits geladen wurde oder nicht.

include module_name

Angenommen, Sie haben einige Methoden, die Sie in zwei verschiedenen Klassen benötigen. Dann müssen Sie sie nicht in beiden Klassen schreiben. Stattdessen können Sie dies im Modul definieren. Und dann fügen Sie dieses Modul in andere Klassen ein . Es wird von Ruby bereitgestellt, um das Prinzip DRY sicherzustellen. Es wird verwendet, um DRY Ihren Code zu aktualisieren, um Doppelarbeit zu vermeiden

2
Shrinivas

Include

Wenn Sie ein Modul in Ihre Klasse include setzen, ist es, als ob Sie das .__ genommen hätten. Code innerhalb des Moduls definiert und in die Klasse eingefügt, wobei Sie "schließen" es ein. Es erlaubt das Mixin-Verhalten. Es wird verwendet, um DRY aufzurufen Ihr Code, um Duplizierungen zu vermeiden, zum Beispiel bei mehreren Klassen, die denselben Code innerhalb des Moduls benötigen.

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

Benötigen

Mit der Require-Methode können Sie eine Bibliothek laden und verhindern, dass mehr als einmal geladen werden. Die Required-Methode gibt "false" zurück, wenn Sie versuchen, dieselbe Bibliothek nach dem ersten Mal zu laden. Die erfordern Die Methode muss nur verwendet werden, wenn die zu ladende Bibliothek in .__ definiert ist. eine separate Datei, was normalerweise der Fall ist.

So wird nachverfolgt, ob die Bibliothek bereits geladen wurde oder nicht. Sie müssen auch nicht die Erweiterung ".rb" des Bibliotheksdateinamens angeben. __ Hier ist ein Beispiel für die Verwendung von. Platzieren Sie die Required-Methode ganz oben in Ihrer ".rb" -Datei:

Belastung

Die Lademethode ist fast wie die Required-Methode, es sei denn, sie ist nicht Verfolgen Sie, ob die Bibliothek geladen wurde oder nicht. So ist es Es ist möglich, eine Bibliothek mehrmals zu laden, und auch bei Verwendung der Last Methode Sie müssen die Erweiterung ".rb" des Bibliotheksdateinamens angeben.

Erweitern

Wenn Sie die extend-Methode anstelle von include verwenden, fügen Sie die Die Methoden des Moduls als Klassenmethoden und nicht als Instanzmethoden.

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

class TestClass 
  extend Log 
  # ... 
end

tc = TestClass.class_type
1
Imran

Im Folgenden sind einige grundlegende Unterschiede zwischen den Anforderungen und Anforderungen aufgeführt: 

Benötigen:

  1. Require liest die Datei aus dem Dateisystem, analysiert sie, speichert sie im Speicher und führt sie an einem bestimmten Ort aus. Wenn Sie also während der Ausführung des Skripts Änderungen vornehmen, wird die Änderung nicht berücksichtigt.
  2. Wir benötigen eine Datei nach Name und nicht nach Modulnamen.
  3. Es wird normalerweise für Bibliotheken und Erweiterungen verwendet.

Umfassen: 

  1. Wenn Sie ein Modul in Ihre Klasse aufnehmen, verhält es sich so, als ob Sie den in Ihrem Modul definierten Code genommen und in Ihre Klasse eingefügt hätten.
  2. Wir enthalten den Modulnamen, nicht den Dateinamen.
  3. Es wird normalerweise verwendet, um den Code auszutrocknen und Duplikate im Code zu entfernen. 
0
Awais Shafqat

Bevor Sie diese Frage beantworten, werde ich Sie kurz über die Verwendung von include () und requir () in PHP informieren.

Um den Inhalt einer Datei PHP in eine andere Datei PHP einzufügen, bevor der Server ihn ausführt. Nun etwas mehr Details zu include() und require().

include () - enthält eine angegebene Datei. Es wird eine Warnung ausgegeben, wenn die Datei nicht gefunden und die restlichen Skripts ausgeführt werden können. include () sollte verwendet werden, wenn die Datei nicht erforderlich ist und der Anwendungsablauf fortgesetzt werden soll, wenn die Datei nicht gefunden wird.

Syntax -

enthalten "Dateiname";

Anstelle von include() können wir include_once() verwenden.

include_once () - Es enthält auch eine angegebene Datei, wenn jedoch bereits eine Datei enthalten ist. Es wird nicht wieder aufgenommen. Es wird auch eine Warnung ausgegeben, wenn die Datei nicht gefunden und die verbleibenden Skripts ausgeführt werden können.

syntax -

include_once ();

requir () - Es enthält auch eine angegebene Datei, es wird jedoch ein schwerwiegender Fehler (E_COMPILE_ERROR) ausgegeben, wenn die Datei nicht gefunden und die Ausführung angehalten wird.

syntax

erfordern "Dateiname";

anstelle von require() können wir require_once(); verwenden.

requir_once () - Enthält auch eine angegebene Datei, wenn bereits eine Datei enthalten ist. Es wird nicht wieder aufgenommen. Es wird ein schwerwiegender Fehler (E_COMPILE_ERROR) ausgegeben, wenn die Datei nicht gefunden wird und die Ausführung angehalten wird.

syntax

einmalig benötigt();

0
Rohit verma