Ruby: パーセント記号 `%` の使い方まとめ

Ruby公式ドキュメントに記載されている`%(パーセント)記号の説明の中から、以下についてまとめました。なお、検証にはRuby 2.6.1を使いました。 剰余(割り算の余り)を表す % %記法(リテラル記法)で使う % 出力フォーマット(書式設定)で使う % printfの% String#%メソッド 参考: Rubyで使われる記号の意味(正規表現の複雑な記号は除く) (Ruby 2.6.0) なお公式ドキュメントにある% ruby -e “puts ‘Hello'”という%の用い方は説明文向けの記法であり、それが「コマンドラインへの入力を表す」という目印でしかありません(実を言うと実際に見かけた記憶がありませんが)。 ちょうど、説明文でのみインスタンスメソッド名に#を付けて#to_sのように書き、実際のRubyスクリプトではそう書かないのと似ています。 1. 剰余の% 剰余演算を表す%は比較的単純です。レシーバー(左辺)と引数(右辺)が数値の場合に剰余演算子と解釈されます。一方が複素数の場合はさすがに未定義エラーになります。 12 % 5 #=> 2 12.0 % 5 #=> 2.0 12.0 % 5.1 #=> 1.8000000000000007 12 % 5.1 #=> 1.8000000000000007 12r % 5r #=> (2/1) Complex(3.14, 0) % Complex(3.14, 0) #=> NoMethodError (undefined method `%’ for (3.14+0i):Complex) 2. %記法の% ここから少々ややこしくなります。 Rubyでは、%qなどのように%の後ろの1文字で機能を指定し、それに続く記号ペアで囲むことでさまざまなリテラルを表現できます。 囲みに使う記号ペアは、{や}、[や]のように対になっているものも、!や!のように同じ記号を使うこともできます。 %q<Hello> #=> “Hello” — 対になる記号で囲んだ場合 %q!World! #=> “World” — 同じ記号で囲んだ場合 %記法で記号ペアを適宜カスタマイズすると、たとえば二重引用符”と一重引用符’が混在するメッセージで自動的に引用符をエスケープしてくれます。エスケープを書かずに済むので便利です。 %q{Warning: “invalid character ‘%’ has been found” } #=> “Warning: \”invalid character ‘%’ has been found\” ” その気になればバッククォートやバックスラッシュ、%自身すら囲み記号として使えます。 %q`World` #=> “World” %q\World\ #=> “World” %q%World% #=> “World” ただし記号ペアに使えるのはASCIIの記号に限るようです。以下は全角疑問符でエラーになった例です。 %q?World? #=> SyntaxError ((irb):88: unknown type of %string) %記法の機能一覧 参考: Ruby Programming/Syntax/Literals - Wikibooks, open books for an open world 以下の説明では簡単のため囲みを[ ]で代表しています。上述のとおり、他にもさまざまなASCII記号を囲みに使えます。 なお、Rubyの式展開(string interpolation)は、二重引用符” “で囲まれた文字列リテラル内に#{ 式 }の形で式を記述することで、式が評価された結果を展開できる機能です。一重引用符’ ‘では式は展開されません。 以下にいくつもの記法がありますが、「式展開できるか」「\でエスケープしたり特殊文字を置けるか」の2点に注目すると理解しやすいと思います。 %[ ](%Q[ ]でも同じ)による二重引用符文字列リテラルの代替 表記 意味 式展開 その他 %[ ]%Q[ ] 二重引用符” “で囲むのと同等 できる ・ \でエスケープや特殊文字を表せる 二重引用符の文字列リテラルと同様、式展開が使えます。 %[Time: #{Time.new}] #=> “Time: 2019-02-27 16:35:58 +0900” — 式展開できる %Q[Time: #{Time.new}] #=> “Time: 2019-02-27 16:35:58 +0900” — 式展開できる \nで改行を表すことも、囲み文字を\[や\]のようにエスケープすることもできます。 puts %[a\n\[\]b] # \nで改行を表したり、囲み文字を\[や\]でエスケープできる a []b 以下の場合にエスケープなしで記号を使えます(式展開#{}をうっかり作らないようにしましょう)。 # 開始/終了が異なるペアの囲み記号で、かつ正しく入れ子になる場合はエスケープなしでもよい %[a[bracket]b] #=> “a[bracket]b” … Continue reading Ruby: パーセント記号 `%` の使い方まとめ