Ruby Users' Guide - ローカル変数

前 - コピー - 次 - 目次

### ローカル変数

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

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

あれ? エラーだ．

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

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

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

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

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

     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

前 - コピー - 次 - 目次