Введение

В компьютерном программировании переменная, область использования которой ограничена частью программы (областью видимости). В информатике локальная переменная – это переменная, имеющая локальную область видимости. Обращение к локальной переменной внутри функции или блока, в котором она объявлена, имеет приоритет над обращением к переменной с тем же именем в более широкой области видимости. В языках программирования с двумя уровнями видимости локальные переменные противопоставляются глобальным переменным. Однако многие языки, произошедшие от ALGOL, допускают любое количество уровней вложенной видимости, с приватными переменными, функциями, константами и типами, скрытыми внутри них посредством вложенных блоков или вложенных функций. Локальные переменные являются основополагающими для процедурного программирования и, в более широком смысле, модульного программирования: переменные локальной области видимости используются для предотвращения проблем, связанных с побочными эффектами, которые могут возникать при использовании глобальных переменных.

Область применения

Локальные переменные могут иметь лексическую или динамическую область видимости, хотя лексическая (статическая) область видимости встречается гораздо чаще. В лексической области видимости (или лексическом объеме; также называемой статической областью видимости или статическим объемом), если область видимости имени переменной – это определенный блок, то ее область видимости – это текст программы, определяющий этот блок: внутри этого блока имя переменной существует и связано со значением переменной, но за пределами этого блока имя переменной не существует. В отличие от этого, в динамической области видимости (или динамическом объеме), если область видимости имени переменной – это определенный блок, то ее область видимости – это этот блок и все функции, вызываемые транзитивно этим блоком (за исключением случаев, когда они переопределяются другим объявлением); после завершения блока имя переменной перестает существовать. Некоторые языки, такие как Perl и Common Lisp, позволяют программисту выбирать статическую или динамическую область видимости при определении или переопределении переменной. Примеры языков, использующих динамическую область видимости, включают Logo, Emacs Lisp, а также языки оболочек bash, dash и "local" объявление оболочки MirBSD Korn (mksh). Большинство других языков предоставляют локальные переменные с лексической областью видимости. В большинстве языков локальные переменные являются автоматическими переменными, хранящимися непосредственно в стеке вызовов. Это означает, что когда рекурсивная функция вызывает себя, локальным переменным в каждом экземпляре функции присваиваются различные адреса. Следовательно, переменные с такой областью видимости могут быть объявлены, записаны и прочитаны без риска возникновения побочных эффектов для функций за пределами блока, в котором они объявлены. Языки программирования, использующие семантику вызова по значению, предоставляют вызываемой подпрограмме собственную локальную копию переданных ей аргументов. В большинстве языков эти локальные параметры обрабатываются так же, как и другие локальные переменные внутри подпрограммы. В отличие от этого, семантика вызова по ссылке и вызова по имени позволяет параметрам выступать в качестве псевдонимов значений, переданных в качестве аргументов, позволяя подпрограмме изменять переменные за пределами своей области видимости.

Статические локальные переменные

Специальный тип локальной переменной, называемый статической локальной, доступен во многих распространенных языках программирования (включая C/C++, Visual Basic, VB.NET и PHP), который позволяет сохранять значение между вызовами функции – это статическая переменная с локальной областью видимости. В этом случае рекурсивные вызовы функции также имеют доступ к (единственной, статически выделенной) переменной. Во всех вышеперечисленных языках статические переменные объявляются с использованием специального ключевого слова класса хранения (например, `static`). Статические локальные переменные в глобальных функциях имеют такой же срок жизни, как и статические глобальные переменные, поскольку их значение сохраняется в памяти на протяжении всего времени работы программы, но имеют область видимости функции (а не глобальную), как и автоматические локальные переменные. Это отличается от других способов использования ключевого слова `static`, которое имеет различные значения в разных языках.

Локальные переменные в Ruby

Ruby как язык также был вдохновлен Perl, но в этом случае синтаксис был упрощен: имя глобальной переменной должно начинаться со знака $, например, $имя_переменной, а у локальной переменной этого знака нет, например, имя_переменной (в то время как в Perl все скалярные значения имеют знак $ в начале). Важно отметить, что Ruby предоставляет встроенную поддержку только для локальных переменных со статической областью видимости, как в Perl с использованием `my`, а не для локальных переменных с динамической областью видимости, как в Perl с использованием `local`. Существует как минимум одна библиотека для Ruby, которая обеспечивает поддержку динамически изменяемых переменных.