В ruby у нас есть то, что мы можем назвать областями видимости - места, когда программа, написанная на ruby, покидает предыдущую область видимости. Эти ворота: class
, module
и метод (ключевое слово def
). Другими словами, после ключевого слова class
, module
из def
в коде, который вы сразу вводите в новую область.
В ruby вложенной видимости не происходит, и как только вы создадите новую область, предыдущая привязка будет заменена новым набором привязок.
Например, если вы определите следующий класс:
x = 1
class MyClass
# you can't access to x from here
def foo
# ...from here too
y = 1
local_variables
end
end
local_variables
вызов метода вернет [:y]
. Это означает, что у нас нет доступа к переменной x
. Вы можете обойти эту проблему, используя методику ruby Flat Scopes . По сути, вместо определения класса с помощью ключевого слова class
вы можете определить его с помощью Class.new
и передать блок этому вызову. Очевидно, что блок может взять любые локальные переменные из области, где он был определен, так как это закрытие!
Наш предыдущий пример можно переписать примерно так:
x = 1
Foo = Class.new do
define_method :foo do
i_can_do_something_with(x)
y = 1
local_variables
end
end
В этом случае local_variables
вернет [:x, :y]
.