Ruby Freaks Lounge

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

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

Kernel#pが引数を返すように

1.8ではpの戻り値は常にnilでしたが,1.9では引数をそのまま返すようになりました。この変更理由は,デバッグをしやすくすることです。

コード7 メソッドの戻り値をpで表示するための変更

# オリジナルの定義
def remove_tags(str)
  str.gsub(/<[^<]+>/, "")
end

# 1.8で戻り値をデバッグ出力させる場合の変更
def remove_tags(str)
  r = str.gsub(/<[^<]+>/, "")
  p r
  r
end

# 1.9の場合はこれだけ
def remove_tags(str)
  p str.gsub(/<[^<]+>/, "")
end

1.8ではタイプ数5+カーソル移動+改行が必要でしたが,1.9ではタイプ数2で済んでいます。取るに足らないことと思うかも知れませんが,デバッグ時のストレスが確実に減ります。

名前つきprintfフォーマット

printfのフォーマット文字列に名前を書き,引数にシンボルをキーとしたハッシュを与えられるようになりました。%sの代わりに%<foo>sなどと書きます。

コード8 名前で値を参照するprinfフォーマット

h = { first_name: "Taro", last_name: "Yamada", age: 30 }
p "%<last_name>s, %<first_name>s (%<age>d)" % h

図2 コード8の実行結果

"Yamada, Taro (30)"

ソースコードの可読性を上げたり,多言語化のためのメッセージを生成したりする場合に使えると思います。Python由来の機能です。

改行の入らないbase64のエンコーディング

[string].pack("m")はstringをbase64変換する機能ですが,メールに特化した古い仕様(RFC2045)に準拠しており,60桁ごとに勝手に改行を挿入していました。1.9で導入されたm0は,RFC4648に準拠したbase64変換を行うため,余計な改行が入りません。

コード9 改行の入らない base64 エンコーディング

puts "m:" ; puts ["a"*46].pack("m")
puts "m0:"; puts ["a"*46].pack("m0")

図3 コード9の実行結果

m:
YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh
YQ==
m0:
YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQ==

Proc関係の増強

最後に,Procに追加された2つのメソッドを紹介します。

Proc#===

Proc#===はProc#callのaliasです。case文のマッチが===メソッドで判定されることと組み合わせることで,以下のようなコードが書けます。

コード10 whenの判定をProcで行う

even = proc {|x| x % 2 == 0 }  # 偶数なら真を返す 
odd  = proc {|x| x % 2 == 1 }  # 奇数なら真を返す

5.times do |i|
  case i
  when even then puts "even!"  # iが偶数の場合
  when odd  then puts "odd!"   # iが奇数の場合
  end
end

図4 コード10の実行結果

even!
odd!
even!
odd!
even!

いちいちproc呼び出しするので実行効率は悪いですが,記述性はあがります。使いどころを選べば使えるでしょう。

Proc#curry

Procをカリー化するProc#curryというメソッドが新設されました。カリー化とは,引数を一度に受け取るのではなく,1個ずつ受け取るようにすることです。

コード 11 Proc のカリー化

# 2つの引数をとって和を返すProc
plus = proc {|x, y| x + y }

# Procをカリー化した Procを返す
plus = plus.curry

# 第1引数だけ適用したProcを返す
add1 = plus[1]

# 得られたProcをcallすると第2引数となり,和が計算される
p add1[42]  #=> 43

まとめ

以上3回にわたって,Ruby1.9の新機能をひとめぐりしました。他にも紹介しきれなかった新機能がありますので,興味のある方はNEWSなどをご参照ください。この記事を読んで,1.9を使ってみたい!と思っていただけたら幸いです。

著者プロフィール

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

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

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