In message "[ruby-list:8474] Re: scope of local variables"
on 98/06/23, Yukihiro Matsumoto <matz / netlab.co.jp> writes:
> 後者では x が最初に代入された場所がブロックの内部なので,x
> はブロック内ローカル変数だとみなされた
ここでいうブロックはeachイテレータのブロックということですよ
ね? ifがスコープを作るわけではないですよね?
> で,後者の場合2回目のループでは条件が成立しないので代入が行
> われないことになります.代入されていないローカル変数の値は
> nilですから,後者の実行結果は川村さんが疑問に思われたような
> 挙動になるわけです.
イテレータ内の変数って、一度ループを回るごとに未定義状態にな
るのでしょうか。毎回yieldされることを考えると当然そうなのか
な。
> 「普通の」ローカル変数は先頭で代入(宣言)しておく
>
> という「ローカル変数のオキテ」に従うことを強くお勧めします.
そうなのですか…。rubyは宣言しなくていいから楽だなあと思って
いたのですが。だけど、配列とかハッシュだとどうせ宣言しないと
いけないし、宣言することで統一すればいいのかな。
> Thread固有変数
> 手続きオブジェクト固有変数
>
> などのために必要なものです.
なるほど。後者はまだこれから勉強しないとわからないのですが、
前者の意味はわかります。
> なお,rubyの変数の種別はそのスコープに代入(宣言)が存在するか
> どうかで決まり,代入が実行されるかどうかには関係ないという大
> 切な原則を覚えておいて下さい.rubyは動的な言語のワリにはそう
> いう静的な部分も持ってます.
まったく誤解していました。実行されるかどうかに依存すると。うー
む、rubyって奥が深いというか、私はあんまりわかっていないなあ。
いつになったら片想い状態から脱っせるのかなあ。
--
川村 尚生