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

Глобальные переменные переменные к нему можно получить доступ из любого места в программе независимо от области действия. Они обозначаются начиная с символа $ (знак доллара). Тем не менее, использование глобальных переменных часто считается «un-Ruby», и вы редко увидите их.

Определение глобальных переменных

Глобальные переменные определяются и используются как любая другая переменная. Чтобы определить их, просто присвойте им значение и начните их использовать. Но, как следует из их названия, присвоение глобальным переменным из любой точки программы имеет глобальные последствия. Следующая программа демонстрирует это. Метод изменит глобальную переменную, и это повлияет на то, как второй метод работает.


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

непопулярный

Так почему же это не-Ruby и почему вы не видите глобальные переменные очень часто? Проще говоря, это нарушает инкапсуляцию. Если какой-либо один класс или метод может изменять состояние глобальных переменных по желанию без уровня интерфейса, любой другие классы или методы, которые полагаются на эту глобальную переменную, могут вести себя неожиданно и нежелательно манера. Кроме того, такие взаимодействия могут быть очень сложными для отладки. Что изменило эту глобальную переменную и когда? Вы будете просматривать довольно много кода, чтобы найти то, что это сделало, и этого можно было бы избежать, не нарушая правила инкапсуляции.

instagram viewer

Но это не значит, что глобальные переменные никогда используется в Ruby. Существует ряд специальных глобальных переменных с однозначными именами (а-ля Perl), которые можно использовать во всей вашей программе. Они представляют состояние самой программы и выполняют такие вещи, как изменение записи и разделителей полей для всех получает методы.

Глобальные переменные

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

Короче говоря, вы редко увидите глобальные переменные. Они часто имеют плохую форму (и «не-Ruby») и действительно полезны только в очень маленьких сценариях, где полное значение их использования может быть полностью оценено. Есть несколько специальных глобальных переменных, которые можно использовать, но по большей части они не используются. Вам не нужно много знать о глобальных переменных, чтобы понимать большинство программ на Ruby, но вы должны хотя бы знать, что они есть.

instagram story viewer