まつもと ゆきひろです

In message "[ruby-list:8472] scope of local variables"
    on 98/06/23, Takao KAWAMURA <kawamura / ike.tottori-u.ac.jp> writes:

|ローカル変数に関して、よくわからないことがあるので教えてくだ
|さい。

ローカル変数はrubyでもっとも難解な部分の一つです.

|下に示すプログラムの出力結果は
|| a
|| a
|となって期待通りなのですが、1行目のx = nilを取ると
|| a
|| nil
|
|となってしまいます。

その理由は

  後者では x が最初に代入された場所がブロックの内部なので,x
  はブロック内ローカル変数だとみなされた

せいです.前者ではブロック外で宣言(代入)されていますから,x
は通常のローカル変数です.

で,後者の場合2回目のループでは条件が成立しないので代入が行
われないことになります.代入されていないローカル変数の値は
nilですから,後者の実行結果は川村さんが疑問に思われたような
挙動になるわけです.

ですから,ローカル変数のワナに引っかからないためには

  「普通の」ローカル変数は先頭で代入(宣言)しておく

という「ローカル変数のオキテ」に従うことを強くお勧めします.
ブロック内変数は

  Thread固有変数
  手続きオブジェクト固有変数

などのために必要なものです.

なお,rubyの変数の種別はそのスコープに代入(宣言)が存在するか
どうかで決まり,代入が実行されるかどうかには関係ないという大
切な原則を覚えておいて下さい.rubyは動的な言語のワリにはそう
いう静的な部分も持ってます.

                                まつもと ゆきひろ /:|)