0️⃣

"%d" % n 2回目の%について

2023/09/30に公開

きっかけ

桁数指定が必要な問題を解けなかった時見つけた例で見慣れない記法を見た

どんなコードか

(1..9).map { |i| "%2d" % (i * j) }.join(" | ") + "\n"

 "%2d" % (i * j)の2回目の%の部分が見慣れないためなにかわからなかった

試してみたこと

puts "%2d" 2
#出力結果
=> syntax error, unexpected integer literal, expecting end-of-input
puts "%2d" 2

2回目の%の役割がわからないので消してみると構文エラーが出た

puts "%2d",2
#出力結果
=>
%2d
2

カンマを入れてみるとそれぞれ別の文字列と整数だと解釈された

2回目の%の正体は何か

標準ライブラリに搭載されてるString#%メソッド という。

メソッドである証拠に、以下のように"文字列".%と書いても動作は変わりません。つまり"文字列"はメソッドのレシーバーということになります。
引用元:https://techracho.bpsinc.jp/hachi8833/2022_02_10/71052

i = 2
j = 1
puts "%2d".%(i * j)
#出力結果
=> 2

調べるにあたって参考にしたページ

https://techracho.bpsinc.jp/hachi8833/2022_12_15/71386
https://techracho.bpsinc.jp/hachi8833/2022_02_10/71052

ちなみに

i = 2
j = 1
puts "%2d" % (i * j)
 # 出力結果
 => 2

10進数・2桁で表示指定しているので2の前にはスペースが入る

i = 2
j = 1
puts sprintf("%2d", i * j)
# 出力結果
 => 2

sprintf("%2d", i * j)"%2d" % (i * j) は同じ役割なのがわかる

Discussion