Какова облаcть видимости локальной переменной?
Новая область видимости для локальной переменной определяется
- на верхнем уровне программы - toplevel
- в определении класса или модуля
- в определении метода
i = 1 # (1)
class Demo
i = 2 # (2)
def meth
i = 3 # (3)
print "In method, i = ", i, "
"
end
print "In class, i = ", i, "
"
end
print "At top level, i = ", i, "
"
Demo.new.meth
(Имейте ввиду, что тело класса - это исполняемый код: инструкция
print в теле класса выполняется во время определения класса.)
Блоки { ... } или do ... end почти всегда порождают новую область видимости. Переменные, созданные внутри блока, не видны вне блока, но если вне блока уже была переменная с таким же именем, новая переменная не создается, и внешняя переменная становится доступна изнутри блока.
a = 0
1.upto(3) do |i|
a += i
b = i*i
end
puts a #=> 6
# b is not defined here
Все это становится важным, когда используются потоки& - каждый поток получает свою копию переменной, локальной для блока потока:
threads = []
for name in ['one', 'two' ] do
threads << Thread.new {
localName = name
a = 0
3.times do |i|
Thread.pass
a += i
print localName, ": ", a, "
"
end
}
end
threads.each {|t| t.join }
Результатом будет:
one: 0 two: 0 one: 1 two: 1 one: 3 two: 3
while, until и for - это управляющие конструкции, а не блоки, и поэтому локальные переменные внутри них будут видны и вне блока. Но loop, тем не менее, является методом, и ассоциированный блок
порождает новую область видимости.
