Ruby 1.9.2 予告編

書いた人:成瀬
編集:たなべ

みなさん、Ruby 1.9 は楽しんでいますか? 今回はそんなみなさんが首を長くして待っているであろう Ruby 1.9.2 で提供される新機能の紹介や、その他の変更点の紹介をします。

新機能

Time クラスの拡張

Time クラスの内部データ構造が独自のものに変更されました。これにより、まず 2038 年問題をはじめとする期間の制限が解決されます。Unix やその文化を引くソフトウェアでは伝統的に Unix epoch と呼ばれる起算時、1970 年 1 月 1 日 UTC からの秒数で時刻を表わして来ました。しかし、この秒数は多くの環境で 32bit 符号付き整数で表されているため、ポータブルに表現可能な時刻の範囲は、1901-12-14 から 2038-01-19 の間に限られていました。Ruby 1.9.2 では起算時からの差を Rational で持つように拡張しています。これにより、メモリの許す限り、過去・未来を表すことが可能となります。

また、より細かい時間を表すことができるようになります。従来の Ruby 1.8 ではマイクロ秒単位、Ruby 1.9.1 ではナノ秒単位よりも細かい時間は、Time では扱うことができませんでした。Ruby 1.9.2 では前述の通り Rational ですので、メモリの許す限り細かい時間を扱うことができます。

さらに Time オブジェクトがそれぞれ別の時差を持つようになります。従来、全ての Time オブジェクトは UTC か現地時間のどちらかの時差しか持つことができませんでした。Ruby 1.9.2 の Time オブジェクトはそれぞれが固有の時差情報を保持しているので、Time だけで時差付きの時刻情報を情報の欠損なく扱うことができるようになりました。

その他、zoneinfo の情報を利用した時差や閏秒情報の取得も追加されています。

Socket API の整理

Addrinfo クラスの導入や多数のメソッド追加を含む改善が行われました。解決された課題としては、TCPServer to UDPSocket が IPv4 に依存していたこと、メソッドの引数が数値や長大な名前の定数、バイナリ値などであったこと、sendmsg や recvmsg 等の機能が提供されていなかったことが挙げられます。

この整理に際して行われた数々のデザイン上の決定は、Rubyist にとって参考になる部分が多いと思われるので、「Socket ナニソレ美味しいの?」な方も見てみると良いかもしれません。

Random クラスの追加 (experimental)

乱数生成器を司る Random クラスが追加されました。従来から乱数生成の手段として Kernel#rand() が提供されてきました。また、環境依存であるがより安全な乱数を生成するものとして、OpenSSL::Random や SecureRandom が提供されています。しかし、これらには、乱数生成器の状態の保存・復帰ができませんでした。Random オブジェクトは Mersenne Twister の乱数生成器をラップしており、その状態を Marshal することができます。

Method#parameters

メソッドの仮引数に関する情報を取得するための API、Method#parameters が追加されます。Merb のアクション引数で使うらしいです。動作例としては以下の通り。

class Foo
  def foo(a,b=2,*c,d,&block)
  end
end
Foo.new.method(:foo).parameters
#=> [[:req, :a], [:opt, :b], [:rest, :c], [:req, :d], [:block, :block]]

なお、ParseTree 亡き Ruby 1.9 での話題として関連して語られることもある、メソッドの中身の情報を取得する方法に関しては未だ検討中です。この類の機能が欲しい方は使いたい具体的な用途を添えて ruby-dev に投稿してみてください。

絵文字系エンコーディングの追加

絵文字系エンコーディングと、その変換が追加されます。なお、これらの変換表は一部に審議中のものを含むため、将来一部が変更される可能性があります。[ruby-dev:40528]

その他いくつかのエンコーディングの追加

Big5-HKSCS と Big5-UAO が追加されます。

Float::INFINITY と Float::NAN の追加

移植性の問題から長らく見送られてきた、Float::INFINITY と Float::NAN が定義されるようになります。Ruby 開発者側で確認しているプラットフォーム以外では利用できない可能性があるため、動いていない場合は報告をお願いします。

Kernel#require_relative の追加

書かれているファイルの有るディレクトリを基準に、相対パスでライブラリを読み込む require_relative が追加されました。

変更点

正規表現における \d、\w、\s の ASCII 化

以前の Ruby 1.9.1 では \d、\w、\s は Unicode を意識した定義になっていました。具体的には /\w/ =~ “あ” がマッチしたりしていました。この挙動は当初の想定以上に実世界で問題を起こすことが判明したため、バグとみなされ、Ruby 1.8 同様 ASCII のみにマッチするように変更されました。なお、この変更はバグ扱いであるため、Ruby 1.9.1-p376 にも取り込まれています。

以前のように Unicode を意識して欲しい場合は、\p{Number}、\p{Word}、\p{Space} 等を用いてください。

Unicode 情報のアップデート

正規表現で使われている Unicode 情報がバージョン 5.2 に更新されました。これにより Unicode Property の値として、ヒエログリフを指定したりできます。

/\p{Egyptian Hieroglyphs}/ =~ "\u{13000}"
=> 0

$LOAD_PATH からカレントディレクトリの削除

セキュリティ上の懸念から $LOAD_PATH ($:) からカレントディレクトリ (.) が削除されました。これに依存していたスクリプトは require_relative を用いるように書き換えることが推奨されます。

Kernel#respond_to?

環境によって実装されていないメソッド、例えば Process#fork などを、Kernel#respond_to? によってチェックすることが可能になりました。

まとめ

Ruby 1.9.2 では 1.9 系初の安定版である 1.9.1 に対してここに挙げた以外にも数多くの細かい改善が行われています。より便利になった Ruby 1.9.2 を楽しみにしていてください。