Как локальные переменные взаимодействуют с вызовами методов, блоками и определениями методов.

Какие типы переменных есть в Ruby?

Для целей этой статьи переменная — это просто метка. Это дает вам, программисту, возможность назвать объект в вашем коде.

Ruby имеет несколько типов переменных, все они определяются тем, где они доступны в вашем коде.

  • Глобальные переменные: «$global»← (как объявляется переменная.)
$variable = “I am available throughout your entire app”
  • Переменные класса: «@@class» ← (как объявляется переменная.)
@@class_variable = “I am accessible by instances of your class, as well as the class itself.”
  • Переменные экземпляра: «@instance»← (как объявляется переменная.
@instance_variable = “I am available throughout the current instance of this class.”
  • Постоянная переменная:"CONSTANT" ← (как объявляется переменная.)
MY_CONSTANT = “Available throughout your app”
  • Локальные переменные:"local" ← (как объявляется переменная.)
local_variable = “I must be passed around to cross scope boundaries, otherwise I obey all scope boundaries.”
  • Блочные переменные (тип локальной переменной): «|var1, var2|» ← (Как объявляется переменная.)
    Переменные блока всегда имеют локальную область действия по отношению к блоку. Это означает, что область действия определяется блоком, поэтому все, что находится между «do..end» для многострочных блоков или «{..}» (фигурные скобки) для однострочных блоков.
  • * Блочные переменные также считаются разновидностью локальных переменных.*
def random_method do |var1,var2|  #inner scope starts after "do"
p ... 
end                               # inner scope closed  
# block scope is inaccessible here - var1 and var2 are not accessible and will generate an error if you try to access them. 

Что такое переменная область действия?

Область действия описывает, какие переменные и методы доступны из любой заданной точки кода. По сути, это означает, где находится интерпретатор ruby ​​во время выполнения данной программы. Если вы заморозите кадр этого интерпретатора в любой момент, что он увидит? Это его масштаб. Всегда будут переменные или методы в области видимости и вне области действия в любом заданном стоп-кадре выполняемой программы.

Область вашей переменной - это то, где в вашей программе переменная доступна для использования. Место, где вы создаете или инициализируете переменную, определяет, где она будет доступна (область действия переменной) программой.

Внутренняя область может обращаться к переменным, инициализированным во внешней области, но не наоборот.

Создание новой области блоком происходит только тогда, когда do/end или {..} следует за вызовом метода. Без вызова метода do/end или {..} не считается блоком и, следовательно, не создает новую внутреннюю область видимости для переменных.

Что такое локальная переменная?

Локальные переменные являются локальными для текущей области видимости, обычно это означает текущий метод. Когда текущая область действия заканчивается, локальные переменные перестают существовать.

В приведенном ниже фрагменте кода мы видим, как второй метод (animal_noises) пытается получить доступ к локальной переменной, объявленной в первом методе (name_cat). Поскольку «имя» является локальным для name_cat, animal_noises не может получить доступ к «имени», потому что оно больше не существует.

Как локальные переменные взаимодействуют с определениями методов:

В строке 7: # Здесь (verbiage) действует как переменная, которую в методе мы называем аргументом или параметром.

Бит (verbiage = «hi») устанавливает параметр по умолчанию. Это полезно, если вам нужно распечатать значение по умолчанию.

В этом случае мы могли бы просто напечатать строку 13 сверху без каких-либо пользовательских параметров, и по умолчанию будет напечатано "hi". Строка 12 выводит наш пользовательский аргумент «до свидания», а строка 13 выводит наше значение по умолчанию, потому что мы не добавили пользовательский аргумент/параметр.

Line 12: greetings("goodbye")  # => "goodbye"
Line 13: greetings()           # => "hi"

Кроме того, вы можете вызывать приветствия в строке 13 без круглых скобок:

Line 13: greetings   # => "hi" 

Как правило, последний синтаксис без круглых скобок является условным в Ruby, если не передаются пользовательские аргументы. Установив параметр по умолчанию как (verbiage = «привет»), даже если мы не передаем параметр

Переменные как указатели:

Переменные указывают на объекты. Вы можете думать о них как о ярлыке, но не как о самом объекте. Чтобы продемонстрировать это, посмотрите на следующее:

a = 17 
a.object_id => 42
puts a => 17
b = a 
b.object_id => 42 
puts b => 17

В приведенном выше случае число 17 — это объект, «a» и «b» — это просто переменные, указывающие на один и тот же объект, и поэтому они имеют один и тот же идентификатор объекта.

Почему это важно? Если вы непреднамеренно переназначите переменные, ваша программа может вести себя неожиданным образом. Рассмотрим следующее:

a = 25
b = a 
puts a => 25
puts a.object_id => 45
puts b => 25
puts b.object_id => 45
a = "hello" 
puts a => "hello"
puts a.object_id => 36
puts b => 25
puts b.object_id => 45

В приведенном выше примере мы переназначаем «a» как строку «hello». Когда мы печатаем, мы получаем этот обновленный строковый объект, включая новый идентификатор объекта. Однако переменная «b» по-прежнему указывает на исходный целочисленный объект.