From: matz@... (Yukihiro Matsumoto) Date: 2001-08-17T12:49:00+09:00 Subject: [ruby-list:30941] Re: [REQ] Regexp#match! まつもと ゆきひろです In message "[ruby-list:30932] Re: [REQ] Regexp#match!" on 01/08/16, Minero Aoki writes: |index は、ぼくも変かなあと思います。マッチでも match という |名前なら変だと思います。でもうまい名前があれば例外でもいい |(or 例外のほうが便利) 場面はあるだろうと。 うむ、気持ちは分かります。ただ、今出ているのではまだ弱い気も します。 |そーですねえ。or/unless ではダメな理由は、まず | | process re.match( str )[1] | |のように書きたい (ローカル変数を無駄に増やしたくない) という点 |です。つまりマッチが目的でなくその結果の MatchData が目的で、 |その結果を(入りくんだ) 式の中に使いたいのです。この場合の目的は |主に気持ちよさです。 これは現状でもnilには[]が定義されていないのでNameErrorになり ますよね。内部エラーならこれで十分という気がします。もちろん、 |(この論理で行くと NameError でもいいじゃないか、と言われそうですが | それに対しては「じゃあなんで RegexpMissmatch ではいけないのか?」 | と答えます。わざわざ名前も変えているわけだから、Ruby が知っている | 範囲で詳細に答えてくれるぶんにはなにも問題はないはず。) という反論はあるわけですが、(あおきさんはこの論法が好きみた いですが)、これはあまり効果的ではないと思います。無限に細分 化することが現実的でない以上、どこかに線を引く必要があるわけ ですが、これだと、今話している事象がどこかに引かれるはずの線 のどちら側にあるべきかについて述べていないからです。 |また前提としてマッチすることを期待したい場面というのもあります。 |たとえると Eiffel の precondition に re.match(arg) が書いてある |ようなもので、マッチする文字列を用意するのはクライアント側の |責任である場合です。この場合にはマッチするかどうかはそもそも |そのメソッドの責任の外にあると考えられるので、マッチしないのは |まさに「例外」として扱ってほしいわけです。あるいは感覚的に言うと、 |ゼロ除算をいちいちチェックしたくない、というのと一緒です。 こちらは前述のものよりはまだ説得力があると思いますが、その場 合には今度は execute という名前がふさわしくなくなるように思 います。 あと、Eiffelのrequire節(precondition)にはboolean式を置けばよ いので、自分で明示的に例外を発生させる必要はない(ということ はRubyでもassertのようなものがあれば自ら例外を発生させる必要 はない) というのも押さえておく必要がありますね。 |ぼくの書いたものから拾ってきた具体例だと、match と raise を組み合わ |せていてしかも MatchData を一回しか使わない例には以下のようなのが |ありました。ついでに失敗した場合の責任の所在も書きました。 これらについては発生させる例外がRegexpMismatchで済むようなも のはないように思われるので、例外を発生させても結局はrescueす る必要があり、となると例外がNameErrorだろうが、ArgumentError だろうが、あるいは例外ではなく単にnilを返すのであろうが、あ んまり変わらないことになりそうな気がします。というか、コード 的にはむしろnilを返した方がすっきりする? まつもと ゆきひろ /:|)