From: Koji Arai Date: 2001-04-09T23:01:35+09:00 Subject: [ruby-dev:12826] Re: String#scan 新井です。 In message "[ruby-dev:12798] Re: String#scan" on 08 Apr 2001 01:47:35 +0900, matz@zetabits.com (Yukihiro Matsumoto) wrote: > まつもと ゆきひろです > |Regexp#match は今一つ使い勝手が悪い気はします。 > > もうちょっと具体的にどう使い勝手が悪いのか聞かせてもらえませ > んか? ぽろっと書いてしまいました(^^;。大した話じゃないのですが、 foo, bar, baz = /(foo)(bar)(baz)/.match("foobarbaz")[1..-1] という記述が妙に長いというか見ためややこしい感じがしてあまり 好きになれません。これでマッチしなかった場合も考慮すると foo, bar, baz = /(foo)(bar)(baz)/.match("foobarbaz").to_a[1..-1] とか、 begin foo, bar, baz = /(foo)(bar)(baz)/.match("foobarbaz")[1..-1] rescue NameError # no match end とかになるわけですが、単純に括弧にマッチした部分文字列の配列 を返すメソッドが欲しい気がします。(冷静に考えて、 `to_a[1..-1]' があるかないかだけなんですけどね) 次にマッチ判定も考慮すると if m = /(foo)(bar)(baz)/.match("foobarbaz") foo, bar, baz = m[1..-1] ... end となるわけですが、ただ情報を伝搬するだけの変数に無理に名前をつける よりは if /(foo)(bar)(baz)/ =~ "foobarbaz" foo, bar, baz = $~[1..-1] ... end と書いた方が(私の場合)全然すっきりするし、この形を一番多用し てます。 # ここで match を使っても良いけどその必然性を感じない。 =~ # は意外と好きなので で、どうだったら(私にとって)最も良いかと言うと if foo, bar, baz = /(foo)(bar)(baz)/.hogehoge("foobarbaz") ... end かな?。ここで、hogehoge はマッチしたら部分文字列の配列を返 し、マッチしなかったらnil を返すメソッドです。 もちろん,今の Ruby は多重代入を条件式に書けませんが代入式は 右辺を返すというルールから、 多重代入式は,右辺が([nil,nil] とかでなく) nil なら「偽」 であれば良いかと思います。まあ文法変えてまでこれ以上マッチを 行うメソッドを増やしても仕方ない気もしますが、とにかくそうい うわけで私の場合は Regexp#match の出番があまりありません。 多分に好みの問題だと思うので聞き流して頂いて全然構いませんよ。 -- 新井康司 (Koji Arai)