LoginSignup
0
0

Ruby の文字列の展開の書き方 [式展開, sprintf, `String#%`]

Last updated at Posted at 2023-07-28

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 の単数形未考慮
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0