akishin999の日記

調べた事などを書いて行きます。

Ruby の sprintf で名前付きパラメータ

先日会社の後輩に教えて貰ったんですが、Ruby 1.9 から Kernel.#sprintf や String#% が Hash を受け取れるようになっていたんですね。
ずっと知らなかったんですが、便利だと思ったので試してみました。

これにより、文字列で SQL での名前付きプレースホルダみたいな事が簡単にできるようになります。

ruby 1.9.3p194 にて確認しました。

単に値を埋め込むだけで、桁数などの書式を指定しない場合は %{} で囲んで名前を付けます。

hash = {name: 'akishin', price: 9999}

sprintf "%{name} 様のお支払い金額は %{price} 円になります。", hash
#=> "akishin 様のお支払い金額は 9999 円になります。"

# Kernel.#format
format "%{name} 様のお支払い金額は %{price} 円になります。", hash
#=> "akishin 様のお支払い金額は 9999 円になります。"

# String#%
"%{name} 様のお支払い金額は %{price} 円になります。" % hash
#=> "akishin 様のお支払い金額は 9999 円になります。"

# 名前で指定する場合は同じパラメータを複数回出力できる
> sprintf "%{lang} %{lang} %{lang}", lang: :Ruby
#=> "Ruby Ruby Ruby"

書式を指定する場合は %<> の方を使用します。

# 桁数などの書式を指定する場合は %<> を使う
sprintf "%{year}年%<month>02d月%<day>02d日", year: 2012, month: 9, day: 1
#=> "2012年09月01日"

文字列のテンプレートを用意しておいて引数を埋め込むような処理は結構多いと思うので、判りやすく書けるようになって嬉しいです。
今後は積極的に使って行きたいと思います。

参考

sprintfが、引数にHashを取って、キーで参照できるようになった
http://d.hatena.ne.jp/xibbar/20081001#1222833103

知って得する21のRubyのトリビアな記法
http://melborne.github.com/2011/06/22/21-Ruby-21-Trivia-Notations-you-should-know-in-Ruby/

module function Kernel.#format
http://rurema.clear-code.com/1.9.3/method/Kernel/m/format.html

instance method String#%
http://rurema.clear-code.com/1.9.3/method/String/i/=25.html