せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】ブロック(変数のスコープを中心に)

 
■topic summary
study about ruby-block. (ruby-ver 2.0.0)


 

ブロックパラメーターにデフォルト値が定義できる

このコードは、本質的には引数が二つあることを期待している。

a = 99
3.times do |i, x=a|
  a = i*10
  p x
end

■実行結果

99
0
10

 

ブロックローカル変数

セミコロンの後にブロックローカル変数を定義できる。
ただしデフォルト値は持てない

a = 99
3.times do |i; x|
  a = i*10
  p x
end

■実行結果

nil
nil
nil
3.times do |i; x=a|
 ⇒syntax error, unexpected keyword_end, expecting end-of-input


 

スコープ

ブロックの中で作られた変数
 ⇒ブロック内だけ
ブロックの外ですでに定義されているローカル変数に値を代入したとき
 ⇒既存のローカル変数に新しい値が代入される

注意点は、ブロック内から参照できる(ブロック外の)変数は
ローカル変数のみということ。
グローバル変数インスタンス変数は参照できない。

このことは、
Ruby1.8⇒1.9へのマイグレーションを行ったクックパッドの資料にも記述がある。

total = 0
3.times {total += 1}
p total

■実行結果

3


ブロックを「関数」と捕らえることで、入力に意識が向き、
結果的にブロック変数のスコープを意識することができたよ。
 
ブロックは関数?と混乱していた様子はこちら。