loop と while true

Rubyのloopとwhile trueは、どちらも無限ループするのですが、メソッドと制御構造という違いがあるので、変数のスコープが異なる。
loopではブロック内でだけ変数が有効であり、while trueはwhile文を抜けたあとでも変数が有効である。


(loop)

puts 'loopでは、変数のスコープがブロックに閉じ込められる'
loop do
  loop_val = 'hogehoge'
  puts loop_val
  break
end
puts loop_val

(実行結果)

$ ruby loop.rb 
loopでは、変数のスコープがブロックに閉じ込められる
hogehoge
loop.rb:7: undefined local variable or method `loop_val' for main:Object (NameError)


(while true)

puts 'while trueでは、変数のスコープがwhile文に閉じ込められない'
while true
  while_val = 'hogehoge'
  puts while_val
  break
end
puts while_val

(実行結果)

$ ruby while.rb 
while trueでは、変数のスコープがwhile文に閉じ込められない
hogehoge
hogehoge