From: Tanaka Akira Date: 2007-12-14T18:17:17+09:00 Subject: [ruby-dev:32597] Re: /(?...)/ =~ str assigns foo In article , Yukihiro Matsumoto writes: > えー、どうなんだろうなあ。 ちなみに、これは昨日今日で思い付いたものではなく、以前からそ うしたいと考えているものです。[ruby-dev:20725] とか。 > * 今までいわゆる代入以外でローカル変数が登場する文法はブロッ > クパラメータしかなく、新しいものを導入するのは抵抗がある > のではないか。しかし、互換性の問題はないので、要するに慣 > れだけの問題という気もする。 ローカル変数の導入はほかにもあります。 * メソッドパラメータ * for var in ... * rescue exc => var rescue のはいつ導入されましたっけ? 最初からあったわけではな いように思います。rescue については新しいものに対する抵抗は 感じられませんし、新しいというだけで抵抗されるということはな いのではないでしょうか。 また、リリースされてしまうと互換性の問題が出るので、ぜひ現時 点で入れたいと思っています。 > * ある変数がローカル変数か無引数のメソッド呼び出しかを区別 > するのがやや困難になるのではないか。しかし、今でも文字列 > 中の式展開の内部に代入があればリテラル内もチェックする必 > 要があるので、圧倒的に困難になるとまでは言えないような気 > もする。 そうですねぇ、そんなに難しいとは感じないのですが、名前を目立 たせられるように (?...) で name の前後に空白を入れられるよ うにするというのはどうですかね。 (?< name >...) とか。 > というわけで、即決できません。特にローカル変数の判別が難しく > なる(かもしれない)のは懸念です。タイミングを考えると1.9.1に導 > 入するのは難しいかも。 上にも書きましたが、互換性の問題が存在しないタイミングで入れ たいと思っています。 あと、利点を述べると if /(?...)/ =~ str foo = $~[:foo] end と 3回 foo と書かないといけないのが以下のように 1回で済むよ うになることです。 if /(?...)/ =~ str end そして、$1, $2, ... の番号は数え間違えてバグの原因になるので 避けたいのですが、 if /(...)/ =~ str foo = $1 end というのは上記の 3回書かなければいけないのに比べて短いので、 $1 を使う誘惑に駆られてしまいます。1回ですむならそっちのほう が短いので間違いにくいほうに誘導できます。 バグを出しにくいスタイルを推奨するという意味でもぜひ入れたい のですが、どうですかね。 -- [田中 哲][たなか あきら][Tanaka Akira]