From: Tanaka Akira Date: 2008-03-03T13:38:04+09:00 Subject: [ruby-dev:33966] Re: [ruby-cvs:22881] Ruby:r15644 (trunk): * test/ruby/test_m17n_comb.rb (TestM17NComb::test_str_chomp): test In article <200802291457.m1TEv6nh008515@ci.ruby-lang.org>, matz@ruby-lang.org writes: > matz 2008-02-29 23:57:04 +0900 (Fri, 29 Feb 2008) > > New Revision: 15644 > > Modified files: > trunk/ChangeLog > trunk/string.c > trunk/test/ruby/test_m17n_comb.rb > > Log: > * test/ruby/test_m17n_comb.rb (TestM17NComb::test_str_chomp): test > updated. > > http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_m17n_comb.rb?r1=15644&r2=15643&diff_format=u > http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/string.c?r1=15644&r2=15643&diff_format=u > http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15644&r2=15643&diff_format=u この変更で、test_m17n_comb.rb の test_str_sub と test_str_sub! に assert(false, "test broken") というコードが 入れられて、test broken とされましたが、これはどのように壊れ ているのでしょうか? この assert を取り除くと "\x80".force_encoding("ASCII-8BIT").sub(Regexp.new("\x80".force_encoding("ASCII-8BIT")),"\xC2\x80".force_encoding("UTF-8")) と t="\x80".force_encoding("ASCII-8BIT").dup;t.sub!(Regexp.new("\x80".force_encoding("ASCII-8BIT")),"\xC2\x80".force_encoding("UTF-8")). で例外が発生する失敗が表れますが、これらは引数も結果も単一の エンコーディングで表現できる文字列しか表れないので、成功して もおかしくないはずです。 実際、sub の第二引数のかわりにブロックを用いて同じことを行う と、そっちは成功します。 "\x80".force_encoding("ASCII-8BIT").sub(Regexp.new("\x80".force_encoding("ASCII-8BIT"))) { "\xC2\x80".force_encoding("UTF-8") } t="\x80".force_encoding("ASCII-8BIT").dup;t.sub!(Regexp.new("\x80".force_encoding("ASCII-8BIT"))) { "\xC2\x80".force_encoding("UTF-8") } また、このテストはまつもとさんが r15640 の変更を行うまでは成 功していました。 http://www.rubyist.net/~akr/chkbuild/debian-sarge/ruby-trunk/log/20080229T201901.diff.txt.gz 失敗するのが正しいとするなら、理由はなんですか? その理由はブロック形式には適用されませんか? -- [田中 哲][たなか あきら][Tanaka Akira]