From: Minero Aoki Date: 2001-08-16T21:10:16+09:00 Subject: [ruby-list:30931] Re: [REQ] Regexp#match! あおきです。 In mail "[ruby-list:30925] Re: [REQ] Regexp#match!" "Akinori MUSHA" wrote: > > m = regexp.match!( str ) >  よく理解できないんですが、与えられた文字列がマッチしないことが > どうして正規表現オブジェクトにとって例外なんでしょうか? オブジェクトに対する要求が「マッチするかどうかの判定」ではなく、 「マッチした結論(部分文字列集合)をよこせ」という要求の場合は、 マッチしないことは例外になりえると思います。 Regexp にとって一番普遍的と思われる match メソッドがデフォルトで 例外を発生するのなら変だと思いますが、メソッド名を変えて明示的に それを要求するならば問題はない、という意見です。 >  条件に適合しないというのはつまり呼び出し元にとっての例外なので、 > 正規表現オブジェクトが例外をあげるのは不適当ではないでしょうか。 これも上と同じように考えられます。Regexp をマッチ判定オブジェクト ではなく「部分文字列取り出しアルゴリズムを封入したもの」と考えると、 マッチしないと「困る」し、Regexp 側の例外であると考えられると思い ます。 > m = regexp.match(str) or raise ArgumentError, .... > > で十分だと思います。あげたい例外は場合によって違いますし。例えば、 > URI モジュールなら InvalidURIError や BadURIError でしょう。 でもそれを言うなら、存在しないファイルを開こうとした場合だって Errno::ENOENT ではおかしい場合もありますよね。コンフィグファイル が存在しないのと、データベースの一部のファイルが存在しないのと、 読もうとしたメールが存在しないのとはずいぶん意味あいは違うはずです。 問題はそれがどのくらいの頻度で違うのか、あるいは意味の違いが重要か、 でしょう。ユーザへのメッセージならば意味を伝えるべきですが、内部の 失敗なら失敗した行為がわかれば十分でしょう。 で、 1. Regexp は文字列の解析に使う 2. 文字列はユーザインターフェイスであることが多い 3. ユーザインターフェイスならばエラーリポートは詳細にすべき なので、解析が失敗した場合の多くは意味を伝えるべき、つまり nil を 返して自分でエラーの意味を伝えさせるべきと考えられます。しかし、 1. いったん前処理をして、一定の条件が満たされているはずの場合 には失敗は所詮「内部エラー」なので、プログラマにエラーの意味まで 報告させることはないはずです。そしてこの場合も、デフォルトにする ほどではないが結構あるんじゃないか? というのがようするに今回の 主張の核です。(具体例は別メールで。) ------------------------------------------------------------------- 青木峰郎