2009年3月26日木曜日

Ruby 1.91がなかなか厄介な件

1月にRubyのバージョンが0.1上がり、1.91になった…のは良いのだが、
ところどころ微妙に変更されていて、大変なことに…。

とりあえず、Stringクラスのsizeメソッドの変更が、地味に痛い。
#-*- coding: windows-31j -*-

str = "あいう"
puts str.size


このスクリプトを、Ruby1.8で実行すると、
C:\Users\hatsune\Desktop>test.rb
6


となっていたのだが、
Ruby1.9で実行すると、
C:\Users\hatsune\Desktop>ruby19 test.rb
3


のように、sizeメソッドで文字列strの中の2バイト文字を認識して、それを1文字として扱ってくれるようになった。
余計な御世話な気がしなくもないが、代わりにbytesizeメソッドを使用すれば、1.8時代と同じように動作させることができるので、なんとか問題にならなかった。


今回のバージョンアップで一番困ったのは、文字コード関係。
#-*- coding: windows-31j -*-

str = "あいう"

puts str[0].to_i
puts str[0]


を実行すると、1.8までは
C:\Users\hatsune\Desktop>test.rb
130
130


となっていたのに対し、1.9では、
C:\Users\hatsune\Desktop>ruby19 test.rb
0


となってしまい、
str[0].to_iのようにして、文字コード(10進数)を取得しようとしても、取得できない問題が発生してしまう。
これは、ただ文字コードを取得するだけなら、ordメソッドを使用する(例: puts str[0].ord)だけでできる("あ"の場合"33440"が返ってくる)
だが、マルチスレッド対応 lameフロントエンド (もどき) v2.0aでは、1バイトずつコードを取得して("あ"の場合"130"と"160")、この値のいずれかが92(\の文字コード)になったとき、Shift-JISのダメ文字として処理していた(本当は2バイト目だけで良いのだが…)ので、処理を見直すハメに…

他にも、#-*- coding: windows-31j -*-を、2バイト文字を使用した全てのライブラリに追加しなければならなかったり、かなり面倒…。


バージョンが変わるたびに、Stringクラスメソッドのような、基本の部分がやたら変わるというのは、どうなんだろうか。
プログラムをソースで配布するのが基本になっているRubyでは、互換性のためだけに、ユーザーにv1.8環境とv1.9環境の両方を用意させる、とか、更新の度にソースを大幅に修正する、ということをしなくてはならなくなるのだが…
RubyScript2Exeも、見事にv1.9では動作しないようだし…

0 件のコメント: