まつもと ゆきひろ@トヨタケーラムです.

ローカル変数についてです.既に説明したようにローカル変数には
ちょっと変わった性質があります(最初に代入が必要なこととか,
イテレータブロック中が有効範囲であるとか).
--
ローカル変数

ローカル変数は小文字のアルファベットか,`_'で始まる名前で指
定される.試してみよう.

 ruby> foo
 ERR: undefined method `foo' for main(Object)

あれ? エラーだ.

実はローカル変数は他の変数と違って,必ず代入によって初期化さ
れる必要がある.最初の代入が宣言の代わりになっているからだ.
定義されていないローカル変数の参照は引数の無いメソッド呼出し
になる.だから`undefined method'なんてエラーが出たんだね.

ただし,メソッドの引数は最初から代入されていると見なされるの
で,改めて代入する必要は無い.

ローカル変数の有効範囲は,

 * class ... endの間
 * module ... endの間
 * def ... endの間
 * プログラムのはじめから終りまで(上記以外)

になる.それとイテレータブロック(メソッドの後ろの{})の中で宣
言された(はじめて代入された)ローカル変数はそのブロックの中だ
けで有効である.

 ruby> i0 = 1; print i0, "\n"; defined? i0
 1
 t
 ruby> loop{i1=5; print i1, "\n"; break}; defined? i1
 5
 nil

ここで使われている`defined?'は変数などが定義されているかどう
かを調べるメソッドである.loopに与えられたイテレータブロック
の中ではじめて代入されたローカル変数i1はブロックを抜けると未
定義であることが分かるだろう.

スコープを共有している手続きオブジェクトはローカル変数も共有
します.

 ruby> i=0
 0
 ruby> p1 = proc{|n| i=n}
 #<Proc>
 ruby> p2 = proc{i}
 #<Proc>
 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