2017-02-09 132 views
2

我已經檢測到一個變量聲明的意外行爲爲if塊瞭解局部變量的作用域:紅寶石,在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塊的變量變得可以從之外訪問塊,這是正確的嗎?爲什麼它對我來說看起來反直覺?
  2. 爲什麼times塊的行爲與if塊不同?

我一直在閱讀this documentation,但我沒有看到if塊情況。

回答

4

在Ruby中,類,模塊,功能模塊和特效都有自己的職責範圍內爲其定義這樣的局部變量通常不會成爲他們的外部訪問。

在Ruby中,邏輯語句,如如果沒有自己的範圍,所以在他們定義的變量堅持類,模塊,功能塊,或PROC他們在哪裏用過的。

這是一個設計選擇的是什麼使Ruby紅寶石的一部分!它可能會覺得反直覺的,因爲像C語言有如果語句和一些(但不是全部)獨立的範圍解釋的語言模仿。

2
  1. 是,if不會引入新的範圍,所以變量可以外
  2. times使用需要的塊,和塊引入了一個新的範圍。

要了解更多有關範圍門請參閱this answer