2017-02-09 10 views
2

я обнаружил неожиданное поведение в объявлении переменной в if блока:Рубин, понимание локальные переменные области видимости в случае блока

puts "local_variables: #{local_variables}" 
puts "defined? my_variable ini: #{defined? my_variable}" 

if true 
    my_variable = 1 
    puts "local_variables in the 'if' block: #{local_variables}" 
end 

1.times do 
    my_variable_2 = 1 
    puts "local_variables in the 'times' block: #{local_variables}" 
    puts "defined? my_variable_2 in the 'times' block: #{defined? my_variable_2}" 
end 

puts "defined? my_variable_2 end: #{defined? my_variable_2}" 
puts "defined? my_variable end: #{defined? my_variable}" 
puts "my_variable: #{my_variable}" 

В результате получается:

local_variables: [:my_variable] 
defined? my_variable ini: 
local_variables in the 'if' block: [:my_variable] 
local_variables in the 'times' block: [:my_variable_2, :my_variable] 
defined? my_variable_2 in the 'times' block: local-variable 
defined? my_variable_2 end: 
defined? my_variable end: local-variable 
my_variable: 1 

Вопросы:

  1. переменные, объявленные в if, становятся доступными из-за пределов if блок, это правильно? почему это выглядит интуитивно понятным для меня?
  2. Почему поведение блока times отличается от блока if?

Я читал this documentation, но я не вижу if блок.

ответ

4

В рубине классы, модули, функции, блоки и procs имеют свою собственную область видимости, поэтому локальные переменные, определенные внутри них, обычно не будут доступны за пределами них.

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

Это выбор дизайна и часть того, что делает рубиновый рубин! Он может казаться противоречащим интуиции, потому что такие языки, как c, имеют отдельные области для , если операторы и некоторые (но не все) интерпретируемые языки имитируют это.

2
  1. Да, if не вводит новую область, поэтому переменные могут быть использованы вне
  2. times берет блок, и блок вводит новую область.

Чтобы узнать больше о размахе ворот см this answer