Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

printf記法を使って変数の多い文字列を楽に生成する

今回はC言語使いにもお馴染み、printf記法の話です。
やや記法が独特なところがありますが、使いこなせば複雑な文字列も割と気軽に生成できます。

以下の例では、出力したいものを

id = 3
measure = 20

とします。

printfだと代入できない

printfはputsやprintと同じように出力(デフォではstdout)をするだけのメソッドです。
これを文字列代入に使おうとすると

> str = printf "id => 0x%04x, measured => 0x%02x\n" , id, measure
id => 0x0003, measured => 0x14
=> nil
> p str
nil
=> nil

……nilが返って来ます。
C言語のsprintfなら、代入先を引数に指定してあげるオプションがあるのですが……
Rubyでは発見できませんでした。
出力先を変更する荒技も考えられますが……オススメはしません。
そこで登場するのが、以下の記法です。

インスタンスメソッド self % args -> String なら代入可能

> str = %Q{id => 0x%04x, measured => 0x%02x} % [id, measure]
 # 「" "」でも大丈夫です
=> "id => 0x0003, measured => 0x14"
> p str
"id => 0x0003, measured => 0x14"
=> "id => 0x0003, measured => 0x14"

%以下に配列を指定すれば複数個のデータでも対応できます。

引数が多くて見難い場合

「%」以降で改行

「%」以降で改行すれば、インタプリタさんは解釈を待ってくれます。*1
言い換えれば、%をつけないとそのままの文字列として出力されます。注意して下さい。

先に配列を作っておく

先に配列を作っておいて呼び出すのも、手ではあります。
ただ、あまりに離れた場所で定義されていると可読性が落ちる恐れがあります。
付け加えれば格納する順番を間違えてデバッグ地獄になる恐れも。

まとめ

もちろん、インライン解釈を使い数行にわけて記入するのも手です。
でも、こっちの方がスマートでいいですね。
HTMLとの合わせ技*2では特に有効な小技です。

参考もと

*1:irbにて確認

*2:erb、slimなど