[ruby-list:236] TUTORIAL - local variables
From:
matz@... (Yukihiro Matsumoto)
Date:
1996-03-01 07:38:08 UTC
List:
ruby-list #236
まつもと ゆきひろ@トヨタケーラムです.
ローカル変数についてです.既に説明したようにローカル変数には
ちょっと変わった性質があります(最初に代入が必要なこととか,
イテレータブロック中が有効範囲であるとか).
--
ローカル変数
ローカル変数は小文字のアルファベットか,`_'で始まる名前で指
定される.試してみよう.
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