From: siena@... (Siena.) Date: 2002-06-04T23:48:37+09:00 Subject: [ruby-dev:17316] Re: blocks and local variables Siena. です。 # 一応、ruby-dev, ruby-list を検索して読んでみましたが、 # 探しきれてないかも。類似案が既出でしたらすみません。 ▼ [ruby-dev:17298] < Yukihiro Matsumoto さん 》ブロックパラメータの最後の値を持ち出すのに使っている例はそれ 》なりにあるようです。ということで、互換性の観点から今のままで 》ブロックパラメータをブロック局所変数にすることはできません。 これまでの記法と上位互換である事は必須なのですよね。 解釈方法を現行のものと将来のものとを切り替えられるようにして 移行期間を設けるとか、そういう問題でもないのですよね、多分。 となると、ゴミだと思いますけれど、ちょっとだけ。 基本的にブロックパラメータは局所変数にして、参照したい 外部スコープの変数を明示するというのはどうでしょうか。 例えば次のように書くと、$b と d が外部スコープを引き継ぐとか。 (1) foo{ |a,{$b},c,{d}| ... } # a, c は局所、$b, d は従来通り "#{x}" で文字列の外の変数を参照するというのからふと思い付きました。 # 両者は全く違うものだというのは分かってます ^^; 》 foo{...} 互換性という事でこうせざるをえないのでしたら、 組み合わせてこんなのとかも思い付きました。 (2) foo{ |a,b,c| ... } # 従来通り (3) foo{ ... } # 局所 (4) foo{ ... } # a, c は局所、b は従来通り # (5) foo{ |a,{b},c| ... } # a, c は従来通り、b は局所 ## 変態的 ^^;? 外部スコープを引き継ぎたい場面と局所化したい (してしまっても良い) 場面の頻度を考えると、(1) (or (4)) がスクリプトを書きやすそうです。 あと、局所変数としたい変数をローカルパラメータの後ろにセパレータ (例えば ';') で区切って列挙できるようにするとかはいかがでしょうか。 宣言形式になっている辺り、Ruby 的ではないかもしれません。 (6) foo{ ... } # a, b は局所、c, d も局所 # は、やっぱり気持ち悪いんですよねぇ # |a| すら、慣れるのに時間が掛かったものですから... --- Siena.