From: sheepman Date: 2002-07-04T23:26:31+09:00 Subject: [ruby-dev:17667] Re: blocks and local variables こんばんは。sheepman です。 On Mon, 17 Jun 2002 21:43:25 +0900 matz@ruby-lang.org (Yukihiro Matsumoto) wrote: > まつもと ゆきひろです > > In message "[ruby-dev:17480] Re: blocks and local variables" > on 02/06/17, Shin Nishiyama writes: > > 同じアイディアはすでに提案されていますが、ネストの問題がある > ので、ブロックローカルであることがわかったとしてもかならずし > もうれしくないかも、という点で決定打になっていません。 > ブロックローカル変数名に固有のシンタックスを付与する案の ひとつとして、変数の後ろに @ を付けるというのはどうでしょうか。 a=1 hoge(){|i| val@ = a ..... } 気持ちとしては、 @hoge がある程度ひろい範囲からのアクセスを可能にし、 @@bar がさらにひろい範囲からのアクセスを可能にするので 逆に foo@ はせまい範囲からのアクセスを意味する気がしないでもない。 1.val@ は常にブロック固有の変数。 hoge(){|i| val@ = 1 foo(){ val@ = 3 } puts val@ #=> 1 } 2.ネストした場合に上のブロックの変数にアクセスするには val@1 (1つ上のブロックの変数)、val@2 (2つ上のブロックの変数) val@@ (上に順番に登っていって最初に一致する変数) hoge(){|i| val@ = 1 foo(){ bar(){ val@2 = 3 } } puts val@ #=> 3 } hoge(){|i| val@ = 1 foo(){ bar(){ puts val@@ #=> 1 } } } hoge(){|i| val@ = 1 foo(){ x = proc{puts val@@} @val = 3 x.call #=> 1 (どうするのが良いんでしょう?) } } val@1 や val@2 は見た目もあんまりなので、val@@ を 使うこと推奨ということで。 #ブロックローカルな変数を最初にで宣言するという案で #個人的に懸念することは宣言による新しい変数の生成と #代入による新しい変数の生成がブロックの中で混在して、 #ソースが見にくくなってしまうのではないかということです。 それでは。 -- sheepman / TAMURA Takashi sheepman@tcn.zaq.ne.jp http://www.tcn.zaq.ne.jp/sheepman/ Key fingerprint = 4E13 FE38 CD73 48D3 38AE 00EE 9E28 F98B D569 848E