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

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


  1. на верхнем уровне программы - toplevel

  2. в определении класса или модуля

  3. в определении метода

  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, тем не менее, является методом, и ассоциированный блок
порождает новую область видимости.

Вход для пользователей