Wat is het verschil tussen opnemen en vereisen in Ruby?

Mijn vraag is vergelijkbaar met “Wat is de verschil tussen opnemen en uitbreiden in Ruby?“.

Wat is het verschil tussen requireen includein Ruby? Als ik alleen de methoden van een module in mijn klas wil gebruiken, moet ik deze dan requireof include?


Antwoord 1, autoriteit 100%

Wat is het verschil tussen?
“opnemen” en “vereisen” in Ruby?

Antwoord:

De include- en required-methoden doen dat wel
heel verschillende dingen.

De vereiste methode doet wat omvat
doet in de meeste andere programma’s
talen: voer een ander bestand uit. Het ook
houdt bij wat je nodig hebt in de
verleden en hebben niet hetzelfde bestand nodig
tweemaal. Een ander bestand uitvoeren zonder
deze toegevoegde functionaliteit kunt u gebruiken
de laadmethode.

De methode include neemt alle
methoden uit een andere module en
neemt ze op in de huidige module.
Dit is iets op taalniveau als
in tegenstelling tot iets op bestandsniveau zoals met
vereisen. De include-methode is de
primaire manier om lessen uit te breiden met
andere modules (meestal aangeduid als
mixen). Als uw klas bijvoorbeeld
definieert de methode “elk”, u kunt
inclusief de mixin-module Enumerable
en het kan fungeren als een verzameling. Dit
kan verwarrend zijn als het werkwoord include
wordt heel anders gebruikt in andere
talen.

Bron

Dus als je alleen een module wilt gebruiken, in plaats van deze uit te breiden of een mix-in te doen, dan moet je requiregebruiken.

Vreemd genoeg is Ruby’s requireanaloog aan C’s include, terwijl Ruby’s includebijna niets lijkt op C’s include.


Antwoord 2, autoriteit 20%

Als je een module gebruikt, betekent dit dat je alle methoden in je klas opneemt.
Als je een klasse extendmet een module, betekent dit dat je de methodes van de module “inbrengt” als klassemethodes.
Als u een klasse includebij een module, betekent dit dat u de methoden van de module “binnenhaalt” als instantiemethoden.

EX:

module A
   def say
     puts "this is module A"
   end
 end
 class B
   include A
 end
 class C
   extend A
 end

B.say
=> ongedefinieerde methode ‘zeg’ voor B:Class

B.new.say
=> dit is module A

C.say
=> dit is module A

C.new.say
=> ongedefinieerde methode ‘zeg’ voor C:Class


Antwoord 3, autoriteit 17%

Uit het boek Metaprogrammering Ruby,

De methode require()lijkt veel op load(), maar is bedoeld voor
een ander doel. Je gebruikt load()om code uit te voeren, en je gebruikt
require()om bibliotheken te importeren.


Antwoord 4, autoriteit 10%

  • Ruby requirelijkt meer op “include” in andere talen (zoals C). Het vertelt Ruby dat je de inhoud van een ander bestand wilt toevoegen. Vergelijkbare mechanismen in andere talen zijn:

  • Ruby includeis een object-georiënteerd overervingsmechanisme dat wordt gebruikt voor mixins.

Er is een goede uitleg hier:

[Het] simpele antwoord is dat vereisen en opnemen in wezen niets met elkaar te maken hebben.

“require”is vergelijkbaar met de C include, wat voor beginners verwarring kan veroorzaken.
(Een opmerkelijk verschil is dat de lokale bevolking in het vereiste bestand “verdampt”
wanneer het vereiste is gedaan.)

De Ruby includelijkt in niets op de C include. De include-instructie “mengt” een module in een klasse. Het is een beperkte vorm
van meervoudige overerving
. Een meegeleverde module geeft letterlijk een “is-een”
relatie op het ding inclusief het.

Nadruk toegevoegd.


Antwoord 5

Heb je ooit geprobeerd een module te require? Wat waren de resultaten? Probeer het gewoon:

MyModule = Module.new
require MyModule # see what happens

Modules zijn niet vereist, alleen inbegrepen!


Antwoord 6

Van Programmeren Ruby 1.9

We zullen een paar punten maken over de include-instructie voordat we verder gaan. Ten eerste heeft het
niets met bestanden te maken. C-programmeurs gebruiken een preprocessor-richtlijn genaamd #include to
voeg tijdens het compileren de inhoud van het ene bestand in het andere in. De Ruby include-verklaring
verwijst eenvoudigweg naar een module. Als die module in een apart bestand staat, moet je
vereisen (of zijn minder vaak gebruikte neef, load) om dat bestand naar binnen te slepen voordat include.
Ten tweede kopieert een Ruby include niet simpelweg de instantiemethoden van de module naar de klasse.
In plaats daarvan maakt het een verwijzing van de klasse naar de meegeleverde module. Indien meerdere klassen
Als u die module opneemt, wijzen ze allemaal naar hetzelfde. Als u de definitie van a . verandert
methode binnen een module, zelfs terwijl je programma draait, alle klassen die dat bevatten
module zal het nieuwe gedrag vertonen.


Antwoord 7

‘Load’- voegt de inhoud van een bestand in. (Parseer bestand elke keer dat het bestand wordt aangeroepen)

‘Vereist’- voegt een bestand geparseerde inhoud in. (Bestand eenmaal geparseerd en opgeslagen in het geheugen)

‘Include’- voegt de module toe aan de klasse en kan methoden binnen de module gebruiken als instantiemethode van de klasse

‘Extend’- voegt de module toe aan de klasse en kan methoden binnen de module gebruiken als klassenmethode


Antwoord 8

Opnemen
Wanneer u een module in uw klas opneemt, zoals hieronder wordt weergegeven, is het alsof u de code die in de module is gedefinieerd, heeft ingevoegd in de klas, waar u deze ‘opneemt’. Het laat het ‘mixin’-gedrag toe. Het wordt gebruikt om je code op te drogen om duplicatie te voorkomen, bijvoorbeeld als er meerdere klassen zijn die dezelfde code in de module nodig hebben.

Laden
De laadmethode is bijna hetzelfde als de eismethode, behalve dat deze niet bijhoudt of die bibliotheek al dan niet is geladen. Het is dus mogelijk om een bibliotheek meerdere keren te laden en ook wanneer u de laadmethode gebruikt, moet u de extensie “.rb” van de bestandsnaam van de bibliotheek opgeven.

Vereist
Met de vereiste methode kunt u een bibliotheek laden en voorkomt dat het meer dan eens wordt geladen. De vereiste methode retourneert ‘FALSE’ als u na het eerst dezelfde bibliotheek probeert te laden. De vereiste methode hoeft alleen te worden gebruikt als de bibliotheek u laadt, wordt gedefinieerd in een apart bestand, dat meestal het geval is.

U kunt dit verkiezen
http://ionrails.com/2009/ 09/19 / Ruby_require-vs-load-vs-include-vs-extend /


Antwoord 9

inclusief

Wanneer u includeeen module in uw klasse opnemen, is het alsof u de
code gedefinieerd in de module en ingevoegd in de klas, waar
Jij ‘neemt het op. Het maakt het gedrag ‘Mixin’ mogelijk. Het wordt gebruikt om op te drogen
Uw code om duplicatie te voorkomen, bijvoorbeeld, als er meerdere waren
Klassen die dezelfde code binnen de module nodig hebben.

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

vereisen

De vereiste methode stelt u in staat om een ​​bibliotheek te laden en voorkomt het
meer dan eens worden geladen. De vereiste methode retourneert ‘false’ als
U probeert na het eerst dezelfde bibliotheek te laden. De vereiste
methode hoeft alleen te worden gebruikt als de bibliotheek u laadt, is gedefinieerd in
een apart bestand, dat meestal het geval is.

Dus het blijft bijhouden of die bibliotheek al is geladen of niet. U hoeft ook de “.RB” -verlenging van de bibliotheekbestandsnaam niet op te geven.
Hier is een voorbeeld van het gebruik van required. Plaats de vereiste methode helemaal bovenaan uw “.rb”-bestand:

Laden

De laadmethode lijkt bijna op de vereiste methode, behalve dat dit niet het geval is
bijhouden of die bibliotheek is geladen of niet. Dus het is
mogelijk om een bibliotheek meerdere keren te laden en ook bij gebruik van de load
methode moet u de extensie “.rb” van de bestandsnaam van de bibliotheek specificeren.

Verlengen

Als je de extend-methode gebruikt in plaats van include, voeg je de
modulemethoden als klassenmethoden in plaats van als instantiemethoden.

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

Antwoord 10

Hieronder staan enkele basisverschillen tussen vereisen en opnemen:

Vereist:

  1. Require leest het bestand uit het bestandssysteem, parseert het, slaat het op in het geheugen en voert het uit op een bepaalde plaats, wat betekent dat als je zelfs maar iets verandert terwijl het script draait, die wijziging niet wordt weergegeven.
  2. We hebben bestanden op naam nodig, niet op modulenaam.
  3. Het wordt meestal gebruikt voor bibliotheken en extensies.

Opnemen:

  1. Als je een module in je klas opneemt, gedraagt deze zich alsof je de code hebt gebruikt die in je module is gedefinieerd en deze in je klas hebt ingevoegd.
  2. We nemen de modulenaam op, niet de bestandsnaam.
  3. Het wordt meestal gebruikt om de code op te drogen en om duplicatie in de code te verwijderen.

Antwoord 11

require(name)

Het geeft bolean true/false terug

De naam die als parameter wordt doorgegeven aan de vereiste, ruby zal proberen het bronbestand met die naam in uw laadpad te vinden.
De methode ‘vereiste’ retourneert ‘false’ als u dezelfde bibliotheek na de eerste keer probeert te laden. De methode ‘vereiste’ hoeft alleen te worden gebruikt als de bibliotheek die u laadt in een apart bestand is gedefinieerd.
Het houdt dus bij of die bibliotheek al geladen was of niet.

include module_name

Stel dat je een aantal methoden hebt die je in twee verschillende klassen moet hebben. Dan hoef je ze niet in beide klassen op te schrijven. In plaats daarvan kunt u het in module definiëren. En neem deze module vervolgens op in andere lessen.
Het wordt geleverd door Ruby om het DRY-principe te garanderen. Het wordt gebruikt om je code op te drogen om duplicatie te voorkomen

Other episodes