with-regex は Ruby 的にはブロックでしょうね。
/xxx(?<var>.....)xxx/.if_match(str) { p var }
こっちのほうが binding よりはマシっぽい。
でも else が書けないのは嫌だな。かなり無理矢理だが、 マッチしなかったらメソッドが nil を返すってことにして……
/xxx(?<var>.....)xxx/.if_match(str) { p var } or return nil
うわ、読みづらっ! これはだめだー。
http://cvs.m17n.org/~akr/diary/d2004_03.html#a2004_03_24_1
名前付き括弧の利点は、括弧の順番が変わっても大丈夫というところだと思います。 そういう利点があるんだから、多少コードが長くなってもいいんじゃないでしょうか。 メソッドを呼ぶと知らないうちにローカル変数に代入されてるってのは やっぱり想像しにくいですよう。
(02:46)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
/(?<s1>foo).*(?<s2>bar).*/.match(string) {|m| p m[:s1]} とか.
MatchData#[] が Symbol を受け付けるようにするだけ.微妙....
if m = regexp.match(string)
puts m[:foo]
else
puts "nothing matched."
end
ってな書き方はできる.Regexp の埋め込み? 気にしちゃいけない :-P
$~[] に名前を使うことに関しては、[ruby-dev:19785] で、まつもとさんが、
「1.9がはじまったら私の方でやります。ちょっと待っててね。」と述べています。
したがって、(ちょっとというのがいつのことかはともかくとして)それはそうなるはずです。
ただ、それだけだと $1 より短くはならないと思うんですよね。