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