Ruby Freaks Lounge

第5回 Ruby 1.9 の新機能ひとめぐり(後編): 知っておくとお得な機能

この記事を読むのに必要な時間:およそ 3 分

前編では1.9の目玉機能を,中編では文法や意味論の改善について紹介しました。

後編である今回は,知っておくとお得な機能を取り上げたいと思います。きっとあなたのRubyライフを快適にするでしょう。

鬼車による正規表現の強化

1.9では正規表現エンジンに鬼車を採用したため,鬼車による拡張機能が利用可能になりました。

名前を使った参照

マッチした部分文字列を,$1や$2のようなインデックス番号ではなく,名前で参照する機能がつきました。

コード1 正規表現のマッチ部分を名前で参照する

# (?<foo>...) にマッチした部分を $~[:foo] で参照できる
if "Taro Yamada" =~ /^(?<first_name>\w+) (?<last_name>\w+)$/
  p $~[:first_name] #=> "Taro"
  p $~[:last_name]  #=> "Yamada"
end

これによって,正規表現を変更した時に$1や$2のインデックスを修正する煩わしさから解放されます。

また,/(?<foo>...)/ =~ stringという形でマッチングした場合のみ,fooという名前のローカル変数が定義されます。

コード2 正規表現のマッチ部分がローカル変数に代入される

if /(?<first_name>\w+)\s+(?<last_name>\w+)/ =~ "Taro Yamada"
  p first_name #=> "Taro"
  p last_name #=> "Yamada"
end

表現能力の向上

\g<n>によって,n番目のグループを参照できます。これによって,従来では表現できなかった括弧の対応などが表現できるようになっています(機能名:田中哲スペシャル)。

コード3 正規表現でかぎ括弧の対応を判定する

# かぎ括弧の対応がとれた文字列にマッチする正規表現
re = /^(\[\g<1>+\]|x)$/

p "[[x][x]]"[re]  #=> "[[x][x]]"
p "[[x][x]"[re]   #=> nil
p "[[x][x]]]"[re] #=> nil

また,16進表記で使われる文字[0-9A-Fa-f]のための省略記法\hが用意されたのも便利です。

順序付きHash

1.8ではHash#eachが要素を列挙する順序は不定でしたが,1.9では挿入順に列挙されることが保証されるようになりました。

コード4 ハッシュの順序が保存される

h = { "dog" => 1, "cat" => 2 }
h["panda"] = 3
h.each {|k| p k }

図1 コード4の実行結果

# 1.8の場合:順序は不定
$ ruby18 hash-order.rb
["cat", 2]
["panda", 3]
["dog", 1]

# 1.9の場合:挿入した順序
$ ruby19 hash-order.rb
["dog", 1]
["cat", 2]
["panda", 3]

これによって,キーの順序を配列として別途管理する煩わしさから解放されます。ただし,Hashのイテレート中に新たなキーを挿入をし続けると無限ループになりますので注意しましょう。ちなみに,この機能はPHPの連想配列に由来します。

プロセスの起動

system関数が拡張され,子プロセスの起動を細かく制御できるようになりました。また,子プロセスの終了を待たないspawn関数も導入されました。

コード5 柔軟なプロセス起動

# 環境変数ENV_VAR=childを指定して起動する
system({ "ENV_VAR" => "child" }, "echo $ENV_VAR")

# 標準出力をファイルにリダイレクトして起動する
open("log", "w") do |f|
  system("echo child", out: f)  # ファイルlogに"child"が書き込まれる
end

# 子プロセスを起動するだけ(子プロセスの終了を待たない)
spawn("echo child") #=> pid

環境変数や標準入出力やエラー出力以外にも,リソース制限やumaskなどの指定ができます。詳しくはri Kernel#spawnをご覧ください。

また,プロセスをデーモン化するためのProcess.daemonメソッドも追加されました(daemon(3)のラッパ)。UNIXでサービス型のプログラムを作る際に便利です。

有理数と複素数が組み込みに

従来rational.rb(有理数ライブラリ)やcomplex.rb(複素数ライブラリ)は添付ライブラリでしたが,1.9では組み込みになりました。

コード6 有理数と複素数

# 1/3+1/6=1/2
p Rational(1,3) + Rational(1,6) #=> (1/2)

# 虚数i*i=-1
p Complex(0,1) * Complex(0,1) #=> (-1+0i)

著者は数学クイズの解答ツールに使ったことがあります。

著者プロフィール

遠藤侑介(えんどうゆうすけ)

某電機メーカーで研究職勤務。個人活動として,2008年1月よりRubyの開発に参加。テストを書いたり,バグをとったり,バグを入れたりしています。好きな言語はRubyとHaskellとOCaml 。使う言語はRubyとC 。

URLhttp://d.hatena.ne.jp/ku-ma-me/

コメント

コメントの記入