- コピー - - 目次

ローカル変数


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


 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

- コピー - - 目次