前編では1.9の目玉機能を、中編では文法や意味論の改善について紹介しました。
後編である今回は、知っておくとお得な機能を取り上げたいと思います。きっとあなたのRubyライフを快適にするでしょう。
鬼車による正規表現の強化
1.9では正規表現エンジンに鬼車を採用したため、鬼車による拡張機能が利用可能になりました。
名前を使った参照
マッチした部分文字列を、$1や$2のようなインデックス番号ではなく、名前で参照する機能がつきました。
これによって、正規表現を変更した時に$1や$2のインデックスを修正する煩わしさから解放されます。
また、/(?<foo>...)/ =~ stringという形でマッチングした場合のみ、fooという名前のローカル変数が定義されます。
表現能力の向上
\g<n>によって、n番目のグループを参照できます。これによって、従来では表現できなかった括弧の対応などが表現できるようになっています(機能名:田中哲スペシャル)。
また、16進表記で使われる文字[0-9A-Fa-f]のための省略記法\hが用意されたのも便利です。
順序付きHash
1.8ではHash#eachが要素を列挙する順序は不定でしたが、1.9では挿入順に列挙されることが保証されるようになりました。
これによって、キーの順序を配列として別途管理する煩わしさから解放されます。ただし、Hashのイテレート中に新たなキーを挿入をし続けると無限ループになりますので注意しましょう。ちなみに、この機能はPHPの連想配列に由来します。
プロセスの起動
system関数が拡張され、子プロセスの起動を細かく制御できるようになりました。また、子プロセスの終了を待たないspawn関数も導入されました。
環境変数や標準入出力やエラー出力以外にも、リソース制限やumaskなどの指定ができます。詳しくはri Kernel#spawnをご覧ください。
また、プロセスをデーモン化するためのProcess.daemonメソッドも追加されました(daemon(3)のラッパ)。UNIXでサービス型のプログラムを作る際に便利です。
有理数と複素数が組み込みに
従来rational.rb(有理数ライブラリ)やcomplex.rb(複素数ライブラリ)は添付ライブラリでしたが、1.9では組み込みになりました。
著者は数学クイズの解答ツールに使ったことがあります。
Kernel#pが引数を返すように
1.8ではpの戻り値は常にnilでしたが、1.9では引数をそのまま返すようになりました。この変更理由は、デバッグをしやすくすることです。
1.8ではタイプ数5+カーソル移動+改行が必要でしたが、1.9ではタイプ数2で済んでいます。取るに足らないことと思うかも知れませんが、デバッグ時のストレスが確実に減ります。
名前つきprintfフォーマット
printfのフォーマット文字列に名前を書き、引数にシンボルをキーとしたハッシュを与えられるようになりました。%sの代わりに%<foo>sなどと書きます。
ソースコードの可読性を上げたり、多言語化のためのメッセージを生成したりする場合に使えると思います。Python由来の機能です。
改行の入らないbase64のエンコーディング
[string].pack("m")はstringをbase64変換する機能ですが、メールに特化した古い仕様(RFC2045)に準拠しており、60桁ごとに勝手に改行を挿入していました。1.9で導入されたm0は、RFC4648に準拠したbase64変換を行うため、余計な改行が入りません。
Proc関係の増強
最後に、Procに追加された2つのメソッドを紹介します。
Proc#===
Proc#===はProc#callのaliasです。case文のマッチが===メソッドで判定されることと組み合わせることで、以下のようなコードが書けます。
いちいちproc呼び出しするので実行効率は悪いですが、記述性はあがります。使いどころを選べば使えるでしょう。
Proc#curry
Procをカリー化するProc#curryというメソッドが新設されました。カリー化とは、引数を一度に受け取るのではなく、1個ずつ受け取るようにすることです。
まとめ
以上3回にわたって、Ruby1.9の新機能をひとめぐりしました。他にも紹介しきれなかった新機能がありますので、興味のある方はNEWSなどをご参照ください。この記事を読んで、1.9を使ってみたい!と思っていただけたら幸いです。