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

Давайте сначала начнем с примера:

def sayname
puts "Your name is #{name}"
end
def whatname
puts "Please enter your name and I'll repeat back to you"
name = gets.chomp
sayname
end
whatname

В приведенном выше примере мы хотим запустить два метода: один запрашивает у пользователя имя и генерирует ввод, а другой вызывает данные, полученные в этом методе. Однако входит ли это в рамки? Короткий ответ — нет. Почему нет? Потому что мы не отправили новую локальную переменную «имя» в новый метод. Когда метод «sayname» пытается прочитать «name», он не знает, как это определить. Мы должны были отправить его после того, как пользователь ввел свое имя. Давайте повторим этот пример правильно:

def sayname(name)
puts "Your name is #{name}"
end
def whatname
puts "Please enter your name and I'll repeat back to you"
name = gets.chomp
sayname(name)
end
whatname

Это довольно базовый пример масштаба, но большинство ошибок кроется в этих мелких хитросплетениях деталей, которые при правильном понимании могут избавить вас от часов бесконечной отладки.

Как правило, локальные переменные (такие как приведенная выше) всегда будут вне области видимости, если их не отправлять и не вызывать в методах или классах, в которых они используются. Это, безусловно, одна из самых распространенных ошибок, с которыми я столкнулся в результате:

NameError (undefined local variable or method)

Понимание того, как ваш код входит в новую область видимости, может помочь избежать легко устраняемых ошибок. Подумайте об этом так: каждый раз, когда вы определяете класс, метод или модуль, ваш код входит в новую область действия. Один из способов разрушить этот барьер или ворота области действия — использовать вместо этого вызовы методов. Взгляните на этот первый пример:

p1 = 1
class SomeClass
   p2 = 2
   p local_variables #Prints the local variables in scope
   def some_method
     p3 = 3
     p local_variables
   end #end of method scope
end #end of class scope
SomeClass.new
someclass.some_method

Глядя на приведенный выше пример, мы можем легко указать, какие данные будут видны при выполнении нашего кода. p2 и p3 будут видны, но поскольку p1 находится за пределами ворот области действия метода класса, мы не увидим его содержимое в области видимости. Если бы мы хотели ввести эту переменную в область видимости — ее пришлось бы вызывать или отправлять извне класса.

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

Примеры взяты из: https://www.sitepoint.com/understanding-scope-in-ruby/