De methode Vereisen in Ruby

Om herbruikbare componenten te maken, die gemakkelijk in andere programma's kunnen worden gebruikt, moet een programmeertaal een manier hebben om die code tijdens de uitvoering soepel te importeren. In Ruby, de vereisen methode wordt gebruikt om een ​​ander bestand te laden en alle instructies uit te voeren. Dit dient om alle klasse- en methodedefinities in het bestand te importeren. Naast het eenvoudig uitvoeren van alle instructies in het bestand, houdt de vereiste methode ook bij welke bestanden eerder zijn vereist en dus geen dubbel bestand vereist.

Gebruik de methode 'vereisen'

De methode vereist neemt de naam van het bestand dat nodig is, als een string, als een enkel argument. Dit kan een pad naar het bestand zijn, zoals ./lib/some_library.rb of een verkorte naam, zoals some_library. Als het argument een pad en volledige bestandsnaam is, zoekt de vereiste methode daar naar het bestand. Als het argument echter een verkorte naam is, zoekt de vereiste methode in een aantal vooraf gedefinieerde mappen op uw systeem naar dat bestand. Het gebruik van de verkorte naam is de meest gebruikelijke manier om de vereiste methode te gebruiken.

Het volgende voorbeeld laat zien hoe u de vereiste-instructie gebruikt. Het bestand test_library.rb bevindt zich in het eerste codeblok. Dit bestand drukt een bericht af en definieert een nieuwe klasse. Het tweede codeblok is het bestand test_program.rb. Dit bestand laadt het test_library.rb bestand met behulp van devereisenmethode en maakt een nieuwe TestClass voorwerp.

zet "test_library inbegrepen"
klasse TestClass
def initialiseren
zet "TestClass-object gemaakt"
einde
einde
#! / usr / bin / env ruby
vereisen 'test_library.rb'
t = TestClass.new

Vermijd naamconflicten

Bij het schrijven van herbruikbare componenten is het het beste om veel variabelen in het globale bereik niet buiten klassen of methoden te vermelden of met behulp van de $ voorvoegsel. Dit is om iets te voorkomen dat "naamruimtevervuiling" wordt genoemd. Als u te veel namen declareert, kan een ander programma of bibliotheek dezelfde naam declareren en een naamconflict veroorzaken. Wanneer twee volledig niet-gerelateerde bibliotheken per ongeluk elkaars variabelen beginnen te veranderen, zullen dingen breken - schijnbaar willekeurig. Dit is een heel moeilijke bug om op te sporen en het is het beste om het gewoon te vermijden.

Om naamconflicten te voorkomen, kunt u alles in uw bibliotheek binnen een module-instructie plaatsen. Dit vereist dat mensen naar uw klassen en methode verwijzen met een volledig gekwalificeerde naam zoals MyLibrary :: my_method, maar het is het waard omdat naamconflicten meestal niet voorkomen. Voor mensen die al uw klassen- en methodenamen in de globale scope willen hebben, kunnen ze dat doen met behulp van de omvatten uitspraak.

Het volgende voorbeeld herhaalt het vorige voorbeeld, maar omsluit alles in een Mijn bibliotheek module. Twee versies van my_program.rb zijn gegeven; een die de omvatten verklaring en een die dat niet doet.

zet "test_library inbegrepen"
module MyLibrary
klasse TestClass
def initialiseren
zet "TestClass-object gemaakt"
einde
einde
einde
#! / usr / bin / env ruby
vereisen 'test_library2.rb'
t = MyLibrary :: TestClass.new
#! / usr / bin / env ruby
vereisen 'test_library2.rb'
inclusief MyLibrary
t = TestClass.new

Vermijd absolute paden

Omdat herbruikbare componenten vaak worden verplaatst, is het ook het beste om geen absolute paden te gebruiken in uw vereiste oproepen. Een absoluut pad is een pad zoals /home/user/code/library.rb. U zult merken dat het bestand op die exacte locatie moet staan ​​om te kunnen werken. Als het script ooit wordt verplaatst of als uw basismap ooit verandert, werkt die verklaring niet meer.

In plaats van absolute paden, is het vaak gebruikelijk om een ./ lib map in de map van uw Ruby-programma. De ./ lib map wordt toegevoegd aan de $ LOAD_PATH variabele die de mappen opslaat waarin de methode vereist zoekt naar Ruby-bestanden. Daarna, als het bestand my_library.rb is opgeslagen in de lib-directory en kan eenvoudig in uw programma worden geladen vereisen 'mijn_bibliotheek' uitspraak.

Het volgende voorbeeld is hetzelfde als het vorige test_program.rb voorbeelden. Het gaat echter uit van de test_library.rb bestand is opgeslagen in de ./ lib map en laadt deze met behulp van de hierboven beschreven methode.

#! / usr / bin / env ruby
$ LOAD_PATH << './lib'
vereisen 'test_library.rb'
t = TestClass.new