著作一覧 |
何が怖いかというと、String#[](n)がStringを返すという変更だった。
というのは、結構、いろいろなところで str[n] == ?x とか書きまくっているからだ。もちろん?xはFixnumだからエラーになると思っていた。
ところが、まさにそれを利用しているはずのRjbのextconf.rbが別にエラーにもならずにmakeしているので不思議に思った。
$ ruby187 -v -e "p 'a'[0] == ?a; p 'a'[0] == 'a'" ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.4.0] true false $ ruby -v -e "p 'a'[0] == ?a; p 'a'[0] == 'a'" ruby 1.9.0 (2008-10-04 revision 19669) [i386-darwin9.5.0] true true
やっぱり、String#[](n)の返り値はStringだ。が、なぜ?xともtrueになるんだ?
と疑問に思ったら
$ ruby -v -e 'p ?x.class' ruby 1.9.0 (2008-10-04 revision 19669) [i386-darwin9.5.0] String $ ruby187 -v -e 'p ?x.class' ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.4.0] Fixnum
あ、そういうことなのか。多分、ユースケース的にもString#[](n)の戻り値と?xの比較のほうが、?xをFixnumとして扱っているものより多いだろうという判断なのかな。
つまり、こっちが非互換となる。
$ ruby187 -v -e 'p ?0 == 0x30' ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9.4.0] true $ ruby -v -e 'p ?0 == 0x30' ruby 1.9.0 (2008-10-04 revision 19669) [i386-darwin9.5.0] false
ジェズイットを見習え |
Fixnumだとencodingを保持できないのです。
すごくロジカルな理由だ!