From: Fumitoshi UKAI Date: 2004-11-28T23:48:41+09:00 Subject: [ruby-dev:24984] Re: jcode tr? : from.upto(to) { |c| a.push c } At Sun, 28 Nov 2004 02:37:37 +0900, Fumitoshi UKAI wrote: > > migemo で http://bugs.debian.org/283192 というバグレポートをうけました。 > これは Debian の > ruby1.8 1.8.1+1.8.2pre2 (ruby 1.8.2 (2004-11-03)) では発生せず、 > ruby1.8 1.8.1+1.8.2pre3 (ruby 1.8.2 (2004-11-23)) で再現します。 > > 調べてみたところ migemo.rb でおこなっている > > class String > # Hiragana to Katakana > def to_katakana > self.gsub(/う゛/, '\\1ヴ').tr('ぁ-ん', 'ァ-ン') > end > > で tr が予想した動作をしていないことがわかりました。 > これをさらにさぐっていくと jcode を使うと以下のような > 動作をしていることがわかりました。 > > $KCODE="e" > require 'jcode' > "あ".upto("う") do |c| p c; end # => "あ" "ぃ" "い" "ぅ" "う" > > a=[]; "あ".upto("う") do |c| a.push c; end > p a # => ["ぇ", "ぇ", "ぇ", "ぇ", "ぇ"] > > a=[]; "あ".upto("う") do |c| d=c.dup; a.push d; end > p a # => ["ぇ", "ぇ", "ぇ", "ぇ", "ぇ"] > > a=[]; "あ".upto("う") do |c| d="#{c}"; a.push d; end > p a # => ["あ", "ぃ", "い", "ぅ", "う"] > > どれも最後の結果が得られるべきだと思うのですが。 とりあえず、string.c の 1.182.2.28 -> 1.182.2.29 の patchの この部分で導入されたbugのようです。 dupした文字列を変更すると元の文字列も変更されてしまいます。 # str="s"; str2 = str.dup; str2[0] += 1; puts str == str2 # => "true" rb_str_modify()の位置が問題だとしても、どこかでrb_str_modify() しないといけないのでは? @@ -1781,7 +1797,6 @@ rb_str_aset_m(argc, argv, str) VALUE *argv; VALUE str; { - rb_str_modify(str); if (argc == 3) { if (TYPE(argv[0]) == T_REGEXP) { rb_str_subpat_set(str, argv[0], NUM2INT(argv[1]), argv[2]); -- 鵜飼文敏