Rubyの制御構造のほとんどは、下記の形式をとる。
予約語 [式 [予約語]] [式 … ] ←節内 end
Rubyの特徴の1つに、節のような制御構造と同様な形式で
呼び出し可能なメソッドをプログラム内で定義できるブロック付きメソッドがある。
オブジェクト.メソッド名[引数(予約語...)] do [|ブロック変数...|] [式 … ] ←ブロック内 end
節とブロックでは変数のスコープが異なる。
- 節は外側のスコープと同じスコープに属する。
- ブロックは内部に新たなスコープが作られるため外側のスコープで参照できない。
if true x = 3 end $stdout.puts x # 結果:3 # x は 節で宣言した変数のため、スコープ内 # ブロック付きメソッド : 「1」オブジェクトのuptoメソッドを実行。1を初期値としてインクリメント 1.upto(3) do |i| y = i + x $stdout.puts y # 結果:4, 5, 6 end $stdout.puts y # 結果 : undefined local variable or method `y' for main:Object (NameError) # y はブロック付きメソッドで宣言した変数のため、スコープ外