Ruby の文字列の展開の書き方として以下の2点をまとめます。
- 式展開
- フォーマット文字列 sprintf, format,
String#%
String#%
のドキュメントを忘れやすいため備忘です。
式展開
リテラルの式展開
# ($ruby = "RUBY"の場合)
"my name is #{$ruby}" #=> "my name is RUBY"
'my name is #{$ruby}' #=> "my name is #{$ruby}"
ダブルクォート(")で囲まれた文字列式、コマンド文字列および正規表現の中では#{式}という形式で式の内容(を文字列化したもの)を埋め込むことができます。式が変数記号($,@)で始まる変数の場合には {}を省略して、#変数名という形式でも展開できます。文字#に続く文字が {,$,@でなければ、そのまま文字#として解釈されます。明示的に式展開を止めるには#の前にバックスラッシュを置きます。
式展開中の式は、ダブルクォートなども含めて Ruby の式をそのまま書くことができます。コメントも許されます。
フォーマット文字列 sprintf, format, %
sprintf(format, *arg) -> String
format(format, *arg) -> String
format 文字列を C 言語の sprintf と同じように解釈し、引数をフォーマットした文字列を返します。
String のインスタンスメソッドの String#%
も sprintf と同じです。
self % args -> String
printf と同じ規則に従って args をフォーマットします。
args が配列であれば Kernel.#sprintf(self, *args) と同じです。それ以外の場合は Kernel.#sprintf(self, args) と同じです。
sprintf フォーマット
Ruby の sprintf フォーマットは基本的に C 言語の sprintf(3) のものと同じです。ただし、short や long などの C 特有の型に対する修飾子がないこと、2進数の指示子(%b, %B)が存在すること、sprintf のすべての方言をサポートしていないこと(%': 3桁区切り)などの違いがあります。
# %d の整数出力
p sprintf("%d", -1) #=> "-1"
p sprintf("%d", 3.1) #=> "3"
# 幅指定、左詰め右詰め、0詰め
p sprintf("%+5d", 11) #=> " +11"
p sprintf("%+-5d", 11) #=> "+11 "
p sprintf("%+05d", 11) #=> "+0011"
# 精度指定
p sprintf("%10.5f", 10) #=> " 10.00000"
引数指定
翻訳で引数の順番は変えないがフォーマット文字列の順番は変わるときによく使っています。
%{name}
Symbol のインスタンス name をキーとする Hash を引数にした場合、対応する値をフォーマットせずに参照します。幅や精度を指定するために使用することができます。
p sprintf('%{foo}f : %{bar}+d', foo: 1, bar: 2) #=> "1f : 2+d"
p '%{foo}f : %{bar}+d' % { foo: 1, bar: 2 } #=> "1f : 2+d"
p '%{turn}ターンの間攻撃力を%{attack}倍' % { turn: 10, attack: 2.5 } #=> "10ターンの間攻撃力を2.5倍"
p '%{attack}x ATK for %{turn} turns' % { turn: 10, attack: 2.5 } #=> "2.5x ATK for 10 turns" # 例なので turns の単数形未考慮