Разбиране Изискване срещу Изискване - относително спрямо Изискване_ всички

Изискване? Require_all? Require_relative?

Преди две седмици беше проектна седмица и изглеждаше, че тренировъчните колела rspec слизат веднага. Разбрах, че едно от нещата, които приех за даденост, е създаването на моя директория на проекти. Бях удобен с изискването за копиране и поставяне или да го напиша вече във файловете си, не бях сигурен дали наистина разбирам метода и други подобни на него методи. Кога да използвам изисквам? require_all? Или изискват относителни?

Какво се изисква?

изискват е метод, който се използва, когато искате да се позовавате и изпълнявате код, който не е записан във вашия текущ файл. Методът поема по пътя под формата на низ като аргумент и има два начина, по който низът може да бъде форматиран - или като абсолютен път или съкратено име.

# абсолютен път
изисквам './app/example_file.rb'
# съкратено име
изискват „example_file“

Съкратен низ срещу абсолютни пътища?

Тъй като програмистите винаги търсят най-ефективния начин за писане на код, често се предпочита вариантът на съкратения низ. Съкратените низове винаги зависят от изброените директории в $ LOAD_PATH. $: е глобална променлива, която се използва за търсене на външни файлове. Може да видите това, използвано във вашия bin / environment.rb така:

# bin / environment.rb
$ LOAD_PATH << './app'

Освен, че е съкратен начин за писане на код, опцията за съкратен низ е за предпочитане пред абсолютния път, тъй като ако решите да преместите .rb файла в друга папка, методът изискване './somewhere/absolute_path.rb' ще се върне false и няма да зареди файла ви, докато ръчно не промените пътя. Изброяването на вашата директория в $ LOAD_PATH позволява гъвкавост и може да зареди външния ви файл, дори и да го преместите в друга папка. Нека да видим как $ LOAD_PATH зарежда директории:

$ LOAD_PATH.unshift (File.expand_path (File.dirname (__ FILE__))), освен ако $ LOAD_PATH.include? (File.expand_path (File.dirname (__ FILE__)))

Require_relative, Require_all

Мислехте, че сте го получили, но ...

Така че сега, когато разбрахме какво изисква, може да се чудим кога да използваме изискване, изискване_релативност и изискване_вс. Това, което забелязах след сканиране през няколко лаборатории през последните няколко седмици, е, че обикновено се извиква, когато се изискват скъпоценни камъни, заредени в gemfile. Въпреки че изискването може да се използва както за изпълнение на скъпоценни камъни, така и за външни зависимости, за предпочитане методът за зареждане на относителни пътища е Requ_relative. Requ_relative е подмножество на изискване и е удобен метод за използване, когато имате предвид файл, който е относителен към текущия файл, върху който работите (по принцип в рамките на една и съща директория на проекта).

Така че защо бихте искали да използвате Requ_relative over изискват? Докато изискват разчитания на директории, заредени в $ :, тамququire_allgem ви позволява да изпълнявате код от други файлове, без да се налага предварително да лопавате в директории. Общото правило е изискването трябва да се използва за външни файлове, като скъпоценни камъни, докато Requ_relative трябва да се използва за препращане към файлове във вашата директория. Въпреки че можете да извикате абсолютни пътища, като използвате и двата метода, но обхватът на requ_relative е по-широк и е запознат с цялата директория, в която пребивава програмата. Технически, изискването може да бъде призовано да работи като Requ_relative:

# тромав
изисквам (File.expand_path ('path_here', File.dirname (__ FILE__)))
# чист
require_relative ( "path_here)

Разглеждайки фрагмента по-горе, Requir_relative е по-ефективна опция при обаждане на файлове.

Какво ще кажете за Requ_all? Този метод е също подмножество на изискване и също така е удобен метод, който върши работата, която File.dirname (__ FILE__) върши. Методът ви позволява да изисквате цялата директория. След като инсталирате Requemall скъпоценния камък, можете да изискате 'Requir_Call' да трансформира тромавото изискване (File.dirname ('lib') в Requ_all 'lib', което 'магически' ще се отнася до файловете в директорията на lib!

Изисквайте и „всички“ от своите „роднини“

В заключение, резервирайте изискването за скъпоценни камъни и се възползвайте от therequire_relative и requ_all скъпоценни камъни, когато се позовавате на файлове за ефективност.

източници: https://www.thoughtco.com/requre-method-2908199 https://apidock.com/ruby/Kernel/require http://www.rubydoc.info/gems/require_all/1.3.0 https: / /stackoverflow.com/questions/837123/adding-a-directory-to-load-path-ruby