まつもと ゆきひろです
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は動的な言語のワリにはそう
いう静的な部分も持ってます.
まつもと ゆきひろ /:|)