521 Stimmen

Was ist der Unterschied zwischen include und require in Ruby?

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

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

583voto

HanClinto Punkte 9253

Was ist der Unterschied zwischen "include" und "require" in Ruby?

Antwort:

Die Methoden include und require bewirken sehr unterschiedliche Dinge.

Die require-Methode hat folgende Aufgaben in den meisten anderen Programmiersprachen Sprachen: eine andere Datei ausführen. Sie verfolgt außerdem verfolgt, was Sie in der Vergangenheit angefordert haben Vergangenheit angefordert haben, und fordert nicht dieselbe Datei zweimal. Um eine andere Datei ohne diese zusätzliche Funktionalität zu nutzen, können Sie die Load-Methode.

Die Include-Methode übernimmt alle Methoden aus einem anderen Modul und sie in das aktuelle Modul ein. Dies ist eine Sache auf Sprachebene im Gegensatz zu im Gegensatz zu einer Sache auf Dateiebene wie bei require. Die Include-Methode ist die primäre Möglichkeit, Klassen mit anderen anderen Modulen zu erweitern (üblicherweise bezeichnet als mix-ins). Wenn zum Beispiel Ihre Klasse die Methode "each" definiert, können Sie das Mixin-Modul Enumerable einbinden und es kann als Sammlung fungieren. Dieses kann verwirrend sein, da das Verb include in anderen Sprachen ganz anders verwendet wird Sprachen sehr unterschiedlich verwendet wird.

Quelle

Wenn Sie also nur ein Modul verwenden wollen, anstatt es zu erweitern oder ein Mix-In zu machen, dann sollten Sie die Option require .

Seltsamerweise ist Ruby's require ist analog zu C's include , während Ruby's include ist fast nicht vergleichbar mit dem von C include .

128voto

Peter Dang Punkte 1245

Wenn Sie ein Modul verwenden, bedeutet das, dass Sie alle Methoden in Ihre Klasse aufnehmen. Wenn Sie extend einer Klasse mit einem Modul, bedeutet dies, dass Sie die Methoden des Moduls als Klasse Methoden. Wenn Sie include einer Klasse mit einem Modul, bedeutet dies, dass Sie die Methoden des Moduls als Instanz Methoden.

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

103voto

Pratik Khadloya Punkte 11945

Aus dem Buch Metaprogramming Ruby,

Le site require() Methode ist sehr ähnlich zu load() aber es ist gedacht für einen anderen Zweck. Sie verwenden load() um Code auszuführen, und Sie verwenden require() um Bibliotheken zu importieren.

65voto

bradheintz Punkte 3082
  • Rubinrot require ist mehr wie "include" in anderen Sprachen (z.B. C). Es sagt Ruby, dass Sie den Inhalt einer anderen Datei einbringen . Ähnliche Mechanismen in anderen Sprachen sind:

  • Rubinrot include ist ein objektorientierter Vererbungsmechanismus, der für Mixins verwendet wird .

Es gibt eine gute Erklärung aquí :

[Die einfache Antwort ist, dass "require" und "include" im Grunde nichts miteinander zu tun haben.

"erfordern" ist dem C-Include ähnlich, was bei Neulingen zu Verwirrung führen kann. (Ein bemerkenswerter Unterschied besteht darin, dass die Locals innerhalb der erforderlichen Datei "verdampfen" wenn die Anforderung abgeschlossen ist.)

Der Rubin einschließen. ist nicht vergleichbar mit dem C-Include. Die include-Anweisung "mischt" ein Modul in eine Klasse ein. Es ist eine eingeschränkte Form der Mehrfachvererbung . Ein eingeschlossenes Modul verleiht dem Ding buchstäblich eine "ist-ein" Beziehung zu dem Ding, das es einschließt.

Hervorhebung hinzugefügt.

9voto

cizixs Punkte 11153

De Ruby programmieren 1.9

Bevor wir fortfahren, noch ein paar Anmerkungen zur Include-Anweisung. Erstens hat sie nichts mit Dateien zu tun. C-Programmierer verwenden eine Präprozessoranweisung namens #include, um um während der Kompilierung den Inhalt einer Datei in eine andere einzufügen. Die Include-Anweisung in Ruby stellt einfach einen Verweis auf ein Modul her. Befindet sich dieses Modul in einer separaten Datei, müssen Sie require (oder sein weniger gebräuchlicher Cousin load) verwenden, um diese Datei vor der Verwendung von include einzufügen. Zweitens kopiert ein Ruby-Include nicht einfach die Instanzmethoden des Moduls in die Klasse. Stattdessen wird ein Verweis von der Klasse auf das eingeschlossene Modul erstellt. Wenn mehrere Klassen dieses Modul einschließen, verweisen sie alle auf dasselbe. Wenn Sie die Definition einer Methode innerhalb eines Moduls ändern, werden alle Klassen, die das Modul einschließen, das neue Verhalten zeigen, selbst wenn das Programm läuft. Modul enthalten, das neue Verhalten zeigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X