去年のクリスマスには Ruby 2.2.0 がリリース されたというのに、いまだに自分の手元には Ruby 1.8 でないと動かないスクリプトが揃っていた。

自分が Ruby のスクリプトを動かしているのは主に Debian GNU/Linux wheezy で、ここでは Ruby 1.8 と Ruby 1.9 を動かすことができる。なので、まずは 1.9 に対応することにした。

Ruby 1.9 の安定版がリリースされたのは、2009年1月31日。

Ruby 1.9.1をリリースしました。これは1.9系統初の安定版リリースです。

Ruby 1.9はRubyの新しい系統です。近代的に、高速に、文法も明確に、多言語化され、多くの改善がなされました。Ruby 1.8系統は2003年以来利用され、多くの素晴らしい製品を生み出しました。本日、1.9の歴史が始まります。

[ruby-list:45836] [ANN] Ruby 1.9.1リリース
Ruby開発コミュニティは1月31日、バージョン1.9系統で初めての安定版となるRuby 1.9.1をリリースした。1.9系では処理エンジンが変わって高速化したほか、処理系として多言語化にも対応。文字列オブジェクトごとにエンコードを指定でき、文字列関連のメソッドはエンコードに併せた処理を行うよう変更された。また、1.8系に比べて一部の文法を明確にしたり、基本的なクラスでもメソッドが追加・削除されているなど大きく変わっている。

高速化したRuby 1.9系、初の安定版リリース - @IT

1.9に移行するために修正したところ

CGI スクリプトから以下を削除して、


BEGIN { $defout.binmode }
$KCODE = 'u'

以下を追加した程度。


Encoding.default_external="UTF-8"

1.8と1.9で挙動がちがうので修正したところ

日時オブジェクト (Date) の差分日数を求めて出力するところが変わってた。

環境は Debian GNU/Linux wheezy (現時点での stable)。


$ uname -mrsv
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u1 x86_64

サンプルコード。


$ cat ./date_sample.rb
require 'date'
 
today = Date.today
aday = Date::new(2015, 2, 10)
diff = today - aday
 
puts today
puts aday
 
puts diff.class
puts diff
puts diff.to_s
puts diff.to_i

Ruby 1.8 での実行結果。差分は「3」と出力される。


$ /usr/bin/ruby1.8 ./date_sample.rb
2015-02-13
2015-02-10
Rational
3
3
3

Ruby 1.9 での実行結果。差分は「3/1」と出力される。


$ /usr/bin/ruby1.9.1 ./date_sample.rb
2015-02-13
2015-02-10
Rational
3/1
3/1
3

Ruby 1.8 でも 1.9 でも、日時の差分は Rational オブジェクトが返されるが、 Rational#to_s による文字列表現が変わったらしい。もう Rational#to_i で無理にでも整数化するしか。

self - x -> Rational | Date

x が日付オブジェクトなら、ふたつの差を返します。 あるいは x が数値ならば、self より x 日前の日付を返します。

instance method Date#-
to_s -> String

自身を人間が読みやすい形の文字列表現にして返します。

"3/5", "-17/7" のように10進数の表記を返します。

instance method Rational#to_s
to_i -> Integer
truncate(precision = 0) -> Rational | Integer

小数点以下を切り捨てて値を整数に変換します。

instance method Rational#to_i

tags: ruby

Posted by NI-Lab. (@nilab)