ローカル変数は小文字のアルファベットか,`_'で始まる名前で指 定される.試してみよう.
ruby> foo ERR: undefined local variable or method `foo' for main(Object)
あれ? エラーだ.
実はローカル変数は他の変数と違って,必ず代入によって初期化さ れる必要がある.最初の代入が宣言の代わりになっているからだ. 定義されていないローカル変数の参照は引数の無いメソッド呼出し になる.だから`undefined local variable or method'なんてエラーが出たんだね.
ただし,メソッドの引数は最初から代入されていると見なされるの で,改めて代入する必要は無い.
ローカル変数の有効範囲は,
になる.それとイテレータブロック(メソッドの後ろの{})の中で宣 言された(はじめて代入された)ローカル変数はそのブロックの中だ けで有効である.
ruby> i0 = 1; print i0, "\n"; defined? i0 1 "local-variable" ruby> loop{i1=5; print i1, "\n"; break}; defined? i1 5 FALSE
ここで使われている`defined?'は変数などが定義されているかどう かを調べるメソッドである.loopに与えられたイテレータブロック の中ではじめて代入されたローカル変数i1はブロックを抜けると未 定義であることが分かるだろう.
スコープを共有している手続きオブジェクトはローカル変数も共有 する.
ruby> i=0 0 ruby> p1 = proc{|n| i=n} #<Proc:0x8deb0> ruby> p2 = proc{i} #<Proc:0x8dce8> ruby> p1.call(5) 5 ruby> i 5 ruby> p2.call 5
手続きオブジェクトで特別な点は,ローカル変数の共有はスコープ から抜けても続くことだ.つまり,上の例におけるp1, p2がスコー プの外に渡されてもローカル変数iの共有は続く(この場合,変数i はp1,p2からしかアクセスできなくなる).
ruby> def foo ruby| i = 15 ruby| get = proc{i} ruby| set = proc{|n| i = n} ruby| return get, set ruby| end ruby> p1, p2 = foo #<Proc>, #<Proc> ruby> p1.call 15 ruby> p2.call(2) 2 ruby> p1.call 2