Ruby защитава външната променлива вътре в блок

Да речем има метод:

def in_block
  x = "This variables outer block"
  3.times do |i|
    x = i
    puts "x inside block - #{x}"
  end
  puts x
end
in_block

# >> x inside block - 0
# >> x inside block - 1
# >> x inside block - 2
# >> 2

Как мога да защитя моите x променливи?


person Зелёный    schedule 13.07.2014    source източник


Отговори (1)


Разделете параметъра в блока с точка и запетая ;, това показва, че блокът се нуждае от собствен x, несвързан с който и да е x, който вече е бил създаден извън блока.

def in_block
  x = "This variables outer block"
  3.times do |i; x|
    x = i
    puts "x inside block - #{x}"
  end
  puts x
end
in_block

# >> x inside block - 0
# >> x inside block - 1
# >> x inside block - 2
# >> This variables outer block

Но какво ще кажете за простото ,? не е същото. Вижте пример, че блокът приема два параметъра:

def in_block
  #x = "This variables outer block"
  [1,2,3,4].each_with_index do |i; x|
  puts x.class
    x = i
    puts "x inside block - #{x}"
  end
  #puts x
end

in_block # => [1, 2, 3, 4]

# >> NilClass
# >> x inside block - 1
# >> NilClass
# >> x inside block - 2
# >> NilClass
# >> x inside block - 3
# >> NilClass
# >> x inside block - 4

и с ,:

def in_block
  #x = "This variables outer block"
  [1,2,3,4].each_with_index do |i, x|
  puts x.class
    x = i
    puts "x inside block - #{x}"
  end
  #puts x
end

in_block # => [1, 2, 3, 4]

# >> Fixnum
# >> x inside block - 1
# >> Fixnum
# >> x inside block - 2
# >> Fixnum
# >> x inside block - 3
# >> Fixnum
# >> x inside block - 4
person Зелёный    schedule 13.07.2014