トップ «前の日記(2008-10-07) 最新 次の日記(2008-10-09)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2008-10-08

_ ruby-1.9はそれほど怖くはない

何が怖いかというと、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
本日のツッコミ(全2件) [ツッコミを入れる]
_ なかだ (2008-10-08 07:00)

Fixnumだとencodingを保持できないのです。

_ arton (2008-10-08 10:20)

すごくロジカルな理由だ!


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え