From: Masaya TARUI Date: 2010-05-11T12:28:51+09:00 Subject: [ruby-dev:41267] Re: Regexpの仕様について 樽家です。 >> 1) バグである。がWONTFIXもしくはパッチ歓迎? >> => バグのままリリースする(している)ならドキュメントに注釈 >> >> 2) 後方参照を許さないのが仕様 >> => ドキュメントバグ。さらに後方参照を含む時に例外を出すべき? >> >> 3) 後方参照が入ると動作未定義が仕様 >> => ドキュメントバグ >> >> 前述しましたが個人的には1が好ましいと思っています。 > > 結論から言えば 3) かと思います。 > そもそもの「MRI の仕様」とは何かというのは難しい問題だと思いますが、 > コードや rdoc の背景にある意図としましょうか。 > その場合、「特に意図はないが現状はそうなっている」なので翻訳すると、 > 「動作未定義」になるような気もします。 > もっとも、実装互換性もたまに考慮したりするので、今の変な動きが > 「仕様」と言えなくもありません。 > > 一方で、MRI の場合動作未定義に対しては仕様バグであるという主張が通りやすい > 気もするので、1) に近い場合もあります。(実装互換性を守る必要がなさそうな場合) 背景と言われるとわからないのですがrdocの表にあらわれてる意図としては、 Return a Regexp object that is the union of the given patterns, i.e., will match any of its parts. The patterns can be Regexp objects, in which case their options will be preserved, or Strings. If no arguments are given, returns /(?!)/. 特に"match any of its parts"だと思うのですが、個々で正しい正規表現をRegexp#unionで合わせてmatch any of its parts を実現できていないのがバグではないかと思ったのです。 ちなみにコードを確認して以下のようなコーナーケースを書いてみました。 a=/#{"(a)"*9}/ b=/(b)\10/ c=/(c)/ [ b, Regexp.union(a,b,c), Regexp.union(b,a,c), Regexp.union(a,c,b) ].each{|re| p [re === "b\10",re === "bb"] } 結果は [true, false] [false, true] [true, false] [false, false] になります。 現実的なコードではないものの、やはりこれが仕様だといわれるとしっくりこないものがあります。 主観的なものなので、共感が得られるかどうかだけですが、そんなことはないでしょうか? ただ、KNOWNBUG にしとくより仕様としておく事の利点も説得された事ですし、特にユースケースがあるわけでもないので、”大多数の用途”で"match any of its parts"である事が仕様だというなら、rdoc と実装が合っていればそれはそれで了解です。 #マニュアルのtrapには記載してほしいですがそういうのはどこに言えばいいんでしょうか? > 今回の場合、誰かがそれっぽいユースケースとパッチを用意すれば、 > 1.9.3 から変わるというのはありそうな話です。 問題にしているのはドキュメントと動作が食い違っている点で(1)がいいというのはあくまで希望なので、 それについてはもし仮にいいパッチが用意できたらFeatureでチケットをきってみる事にします。 -- 樽家昌也(Masaya TARUI) No Tool,No Life.