Глобални променливи в Ruby

Глобалните променливи са променливи които могат да бъдат достъпни от всяка точка на програмата, независимо от обхвата. Те се означават като се започва с знак $ (долар). Използването на глобални променливи обаче често се смята за „не-Ruby“ и рядко ще ги видите.

Дефиниране на глобални променливи

Глобалните променливи се дефинират и използват като всяка друга променлива. За да ги дефинирате, просто им присвойте стойност и започнете да ги използвате. Но както подсказва името им, приписването на глобални променливи от всяка точка на програмата има глобални последици. Следващата програма демонстрира това. Методът ще промени глобална променлива и това ще повлияе на начина, по който втори метод работи.


$ скорост = 10. def ускори. $ скорост = 100. край. дефинирай pass_speed_trap. ако $ speed> 65. # Дайте на програмата билет за превишена скорост. край. край. ускори. pass_speed_trap. 

непопулярен

Така че защо това е "un-Ruby" и защо не виждате глобални променливи много често? Казано по-просто, той нарушава капсулацията. Ако някой клас или метод може да променя състоянието на глобалните променливи по свое желание без никакъв интерфейсен слой други класове или методи, които разчитат на тази глобална променлива, могат да се държат неочаквано и нежелателно начин. Освен това подобни взаимодействия могат да бъдат много трудни за отстраняване на грешки. Какво промени тази глобална променлива и кога? Ще прегледате доста код, за да намерите какво го е направил и това би могло да бъде избегнато, ако не нарушите правилата на капсулирането.

instagram viewer

Но това не означава, че глобалните променливи са никога използван в Ruby. Съществуват редица специални глобални променливи с имена с единични знаци (a-la Perl), които могат да се използват в цялата ви програма. Те представляват състоянието на самата програма и правят неща като промяна на разделителите на записи и полета за всички получава методи.

Глобални променливи

  • $0 - Тази променлива, обозначена с $ 0 (това е нула), съдържа името на сценария от най-високо ниво. С други думи, скрипт файлът, който е стартиран от командна линия, а не скрипт файлът, който съдържа текущия изпълняващ код. Така че, ако script1.rb беше стартиран от командния ред, той ще държи script1.rb. Ако този скрипт изисква script2.rb, $ 0 в този скриптов файл също ще бъде script1.rb. Името $ 0 отразява конвенцията за именуване, използвана в скриптовете за обозначения на UNIX за същата цел.
  • $* - Аргументите на командния ред в масив, обозначен с $ * (знак долар и звездичка). Например, ако бягате ./script.rb arg1 arg2, тогава $ * ще бъде еквивалентен на % w {arg1 arg2}. Това е еквивалентно на специалното ARGV масив и има по-малко описателно име, така че рядко се използва.
  • $$ - Идентификационен номер на процеса на преводача, обозначен с $$ (два знака за долар). Познаването на собствения идентификационен номер на процеса често е полезно в демонови програми (които работят на заден план, неприкачени към който и да е терминал) или системни услуги. Това обаче става малко по-сложно, когато се включват нишки, така че внимавайте да го използвате сляпо.
  • $ / и $ \ - Това са разделителите за запис на вход и изход. Когато четете обекти с помощта получава и ги отпечатайте с помощта поставя, той ги използва, за да знае кога е прочетен пълен "запис" или какво да се отпечатва между множество записи. По подразбиране това трябва да е символът на новата линия. Но тъй като те влияят върху поведението на всички IO обекти, те рядко се използват, ако изобщо. Може да ги видите в по-малки скриптове, където нарушаването на правилата за капсулиране не е проблем.
  • $? - Състояние на изхода на последния изпълнен процес на дете. От всички изброени тук променливи, това вероятно е най-полезното. Причината за това е проста: не можете да получите състоянието на изход на дъщерните процеси чрез тяхната възвръщаема стойност от система метод, само вярно или невярно. Ако трябва да знаете действителната възвръщаема стойност на дъщерния процес, трябва да използвате тази специална глобална променлива. Отново името на тази променлива е взето от черупките на UNIX.
  • $_ - Последният низ, прочетен от получава. Тази променлива може да бъде объркване за тези, които идват в Руби от Perl. В Perl, the $ _ променлива означава нещо подобно, но напълно различно. В Перл, $_ държи стойността на последния оператор и в Ruby държи низ, върнат от предишния получава извикване. Използването им е подобно, но това, което те наистина притежават, е много различно. Не често виждате и тази променлива (помислете за нея, рядко виждате някоя от тези променливи), но може да ги видите в много кратки Ruby програми, които обработват текст.

Накратко, рядко ще видите глобални променливи. Те често са в лоша форма (и "un-Ruby") и са наистина полезни само в много малки скриптове, където може да се оцени пълното значение на тяхното използване. Има няколко специални глобални променливи, които могат да бъдат използвани, но в по-голямата си част те не се използват. Не е нужно наистина да знаете всичко толкова за глобалните променливи, за да разберете повечето програми на Ruby, но поне трябва да знаете, че те са там.