From: matz@... (Yukihiro Matsumoto) Date: 1998-06-23T18:16:53+09:00 Subject: [ruby-list:8474] Re: scope of local variables まつもと ゆきひろです In message "[ruby-list:8472] scope of local variables" on 98/06/23, Takao KAWAMURA writes: |ローカル変数に関して、よくわからないことがあるので教えてくだ |さい。 ローカル変数はrubyでもっとも難解な部分の一つです. |下に示すプログラムの出力結果は || a || a |となって期待通りなのですが、1行目のx = nilを取ると || a || nil | |となってしまいます。 その理由は 後者では x が最初に代入された場所がブロックの内部なので,x はブロック内ローカル変数だとみなされた せいです.前者ではブロック外で宣言(代入)されていますから,x は通常のローカル変数です. で,後者の場合2回目のループでは条件が成立しないので代入が行 われないことになります.代入されていないローカル変数の値は nilですから,後者の実行結果は川村さんが疑問に思われたような 挙動になるわけです. ですから,ローカル変数のワナに引っかからないためには 「普通の」ローカル変数は先頭で代入(宣言)しておく という「ローカル変数のオキテ」に従うことを強くお勧めします. ブロック内変数は Thread固有変数 手続きオブジェクト固有変数 などのために必要なものです. なお,rubyの変数の種別はそのスコープに代入(宣言)が存在するか どうかで決まり,代入が実行されるかどうかには関係ないという大 切な原則を覚えておいて下さい.rubyは動的な言語のワリにはそう いう静的な部分も持ってます. まつもと ゆきひろ /:|)