From: Takaaki Tateishi Date: 2002-06-19T01:09:05+09:00 Subject: [ruby-dev:17515] Re: blocks and local variables 立石です. At Tue, 18 Jun 2002 14:30:09 +0900, > とされちゃうと、私にとってのメリット(つまり問題解決に益する > かという点で)が無いだけでなく、まだ決まっていない問題解決案 > との整合性に悩む可能性が出る点でデメリットの方が大きいです。 互換性をもったく捨ててしまうということが許されるならすべてブロック ローカルな変数としてしまうのが一貫していて良いとは思います. この場合問題となるのが,ブロック外の変数への代入をどうするかというこ とですが,ブロック外の変数を使うということを明示するのが良いと思いま す.たとえば,以下の動作を期待します. foo{ x = 0 # --- (1) bar{ x = 1 # --- (2) } p x # => 0 } もし,(2)で(1)と同じ変数を使いたければ, foo{ x = 0 # --- (1) bar{ uplevel x # (1)の変数を使うことを宣言する x = 1 } p x # => 1 } とするのはどうだろうと考えています.あるいは,上のレベルのブロックへ アクセスする :: という記法を借りて foo{ x = 0 # --- (1) bar{ ::x = 1 # (1)の変数へ代入 (x := 1 などの記法でもいいですが…) } p x # => 1 } などでもよいかと. > |1.xでは上のブロック内変数にアクセスするというみせかけだけの文法を用意 > |して,現状維持も良いかもしれないと今ちょっとだけ思っています. > > 「上のブロック内変数にアクセスするというみせかけだけの文法」っ > てなんですか? '::'や'uplevel'は外のブロックで宣言された変数への代入を実現するために 使っています.現在では,こんな '::'や'uplevel'は必要なく foo{ x = 0 bar{ x = 1 } p x # => 1 } と書くことができます.もし,'::','uplevel'などを将来的に導入する場合 まず何もしない '::', 'uplevel' を用意して foo{ x = 0 bar{ ::x = 1 } p x # => 1 } などと書いてもらうことを推奨しておくと,仕様を変更したときに影響を受ける プログラムをある程度減らすことができるものと考えていました. -- Takaaki Tateishi