From: Yukihiro Matsumoto Date: 2008-01-29T15:27:13+09:00 Subject: [ruby-dev:33493] Re: /#{}/e.encoding まつもと ゆきひろです [ruby-dev:33484]で催促されたので。 In message "Re: [ruby-dev:33400] /#{}/e.encoding" on Sat, 26 Jan 2008 12:14:00 +0900, Tanaka Akira writes: | |以下のように /#{}/e の encoding が US-ASCII になります。 | | % ./ruby -ve 'p(/#{}/e.encoding)' | ruby 1.9.0 (2008-01-26 revision 15237) [i686-linux] | # | |正規表現のソースを構成する文字列の連結時に EUC-JP な |encoding が消えてしまうのが理由なようです。 なるほど。 |もともとこの連結に単なる文字列連結を使うのは、エスケープされ |た中途半端な非 ASCII 文字が連結されて中途半端でないものにな |るのを検出できないという問題があります。なので、 |Regexp.preprocess というメソッドを新設して、そこで連結を行い、 |エンコーディングの伝播も以前同様ににされるようにしてみました。 やはりコンパイル内部の事情をメソッドとして見せちゃうのには ちょっと抵抗があります。たとえばto_strのようなランタイムなら 気にならないのにな。 で、命令を増やすのは望ましくないということなんですが、ならば toregexp命令がcntオペランドを受け付けるようにして、その中で preprocess関数を呼ぶようにしてはどうでしょう? まつもと ゆきひろ /:|)