Metoden "Kræv" i Ruby

For at skabe genanvendelige komponenter, dem, der let kan bruges i andre programmer, skal et programmeringssprog have en måde at jævnligt importere den kode på runtime. I Rubin, det kræve metoden bruges til at indlæse en anden fil og udføre alle dens udsagn. Dette tjener til at importere alle klasser og metode definitioner i filen. Ud over blot at udføre alle udsagn i filen, holder metoden kræver også oversigt over hvilke filer, der tidligere har været påkrævet, og vil derfor ikke kræve en fil to gange.

Ved hjælp af 'kræv'-metoden

Metoden kræver navnet på den fil, der skal kræves, som en snor, som et enkelt argument. Dette kan enten være en sti til filen, f.eks ./lib/some_library.rb eller et forkortet navn, f.eks some_library. Hvis argumentet er en sti og et komplet filnavn, vil den krævede metode søge der efter filen. Hvis argumentet imidlertid er et forkortet navn, søger kravsmetoden gennem et antal foruddefinerede mapper på dit system efter den fil. Brug af det forkortede navn er den mest almindelige måde at bruge den krævede metode.

instagram viewer

Følgende eksempel viser, hvordan man bruger kravopgørelsen. Filen test_library.rb er i den første kodeblok. Denne fil udskriver en meddelelse og definerer en ny klasse. Den anden kodeblok er filen test_program.rb. Denne fil indlæser test_library.rb arkiv ved hjælp af kravet og oprette en ny TestClass objekt.

sætter "test_library inkluderet"
klasse TestClass
def initialiserer
sætter "TestClass-objekt oprettet"
ende
ende
#! / usr / bin / env ruby
kræver 'test_library.rb'
t = TestClass.new

Undgå navnekollisioner

Når du skriver genanvendelige komponenter, er det bedst ikke at angive mange variabler i det globale omfang uden for nogen klasser eller metoder eller ved at bruge $ præfiks. Dette er for at forhindre noget, der hedder "navneforurening. "Hvis du erklærer for mange navne, kan et andet program eller bibliotek muligvis erklære det samme navn og forårsage et navnesammenstød. Når to helt uafhængige biblioteker ved en fejltagelse begynder at ændre hinandens variabler, vil ting bryde - tilsyneladende tilfældigt. Dette er en meget vanskelig bug at spore, og det er bedst bare at undgå det.

For at undgå sammenstød med navne kan du vedlægge alt i dit bibliotek inde i et modul udmelding. Dette kræver, at folk henviser til dine klasser og metode med et fuldt kvalificeret navn som f.eks MyLibrary:: my_method, men det er det værd, da navnekonflikter normalt ikke forekommer. For mennesker, der ønsker at have alle dine klasse- og metodenavne i det globale omfang, kan de gøre det ved hjælp af omfatte udmelding.

Følgende eksempel gentager det foregående eksempel, men omslutter alt i a MyLibrary modul. To versioner af my_program.rb er givet; en der bruger omfatte en erklæring, og en der ikke gør det.

sætter "test_library inkluderet"
modul MyLibrary
klasse TestClass
def initialiserer
sætter "TestClass-objekt oprettet"
ende
ende
ende
#! / usr / bin / env ruby
kræver 'test_library2.rb'
t = MyLibrary:: TestClass.new
#! / usr / bin / env ruby
kræver 'test_library2.rb'
inkluderer MyLibrary
t = TestClass.new

Undgå absolutte stier

Fordi genanvendelige komponenter ofte flyttes rundt, er det også bedst at ikke bruge absolutte stier i dine krævede opkald. En absolut sti er en sti som /home/user/code/library.rb. Du vil bemærke, at filen skal være på det nøjagtige sted for at kunne fungere. Hvis scriptet nogensinde flyttes, eller dit hjemmekatalog ændres nogensinde, vil det kræve udsagn stoppe med at fungere.

I stedet for absolutte stier er det ofte almindeligt at oprette en ./lib bibliotek i dit Ruby-programmets bibliotek. Det ./lib - kataloget tilføjes til $ LOAD_PATH variabel, der gemmer de mapper, hvor metoden kræver søgning efter Ruby-filer. Efter dette, hvis filen my_library.rb er gemt i lib-biblioteket, det kan indlæses i dit program med en simpel kræver 'my_library' udmelding.

Følgende eksempel er det samme som det foregående test_program.rb eksempler. Imidlertid antages det, at test_library.rb filen gemmes i ./lib katalog og indlæses ved hjælp af metoden beskrevet ovenfor.

#! / usr / bin / env ruby
$ LOAD_PATH << './lib'
kræver 'test_library.rb'
t = TestClass.new
instagram story viewer