使い方まとめ|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。2.6で追加されたstepのエイリアスとしての%についても追記しました。Ruby公式ドキュメントに記載されている`%(パーセント)記号の説明の中から、以下についてまとめました。2.6.1を使いました。'Hello'"という%の用い方は説明文向けの記法であり、それが「コマンドラインへの入力を表す」という目印でしかありません(実を言うと実際に見かけた記憶がありませんが)。説明文でのみインスタンスメソッド名に#を付けて#to_sのように書き、実際のRubyスクリプトではそう書かないのと似ています。剰余の%剰余演算を表す%は比較的単純です。レシーバー(左辺)と引数(右辺)が数値の場合に剰余演算子と解釈されます。一方が複素数の場合はさすがに未定義エラーになります。%記法の%ここから少々ややこしくなります。Rubyでは、%qなどのように%の後ろの1文字で機能を指定し、それに続く記号ペアで囲むことでさまざまなリテラルを表現できます。囲みに使う記号ペアは、{や}、[や]のように対になっているものも、!や!のように同じ記号を使うこともできます。同じ記号で囲んだ場合%記法で記号ペアを適宜カスタマイズすると、たとえば二重引用符"と一重引用符'が混在するメッセージで自動的に引用符をエスケープしてくれます。エスケープを書かずに済むので便利です。"その気になればバッククォートやバックスラッシュ、%自身すら囲み記号として使えます。"World"ただし記号ペアに使えるのはASCIIの記号に限るようです。以下は全角疑問符でエラーになった例です。上述のとおり、他にもさまざまなASCII記号を囲みに使えます。}の形で式を記述することで、式が評価された結果を展開できる機能です。'では式は展開されません。以下にいくつもの記法がありますが、「式展開できるか」「\でエスケープしたり特殊文字を置けるか」の2点に注目すると理解しやすいと思います。\でエスケープや特殊文字を表せる二重引用符の文字列リテラルと同様、式展開が使えます。式展開できる\nで改行を表すことも、囲み文字を\[や\]のようにエスケープすることもできます。\nで改行を表したり、囲み文字を\[や\]でエスケープできるa[]b以下の場合にエスケープなしで記号を使えます(式展開#{}をうっかり作らないようにしましょう)。"!\#$%&'()*,-./:;[<>]?@^_`{|}~\\\""以下の場合はエスケープしないとエラーになります。・\でエスケープや特殊文字を表現できない(\は単なる文字扱い)式展開は行われません(一重引用符と機能が同等なので)。IRBなどでは、%qと一重引用符のどちらも二重引用符として出力されます。式展開されない\が無視されますので、\nなどもそのまま出力されます。出力フォーマット用の%ある意味最もややこしいのが、出力フォーマットで使われる%記号です。%d"の%dは、渡された数値を十進数で出力するという書式指示になります。以下のように小数値10.0を渡しても、出力は10になります。10"String#%メソッド上の式には%が「もうひとつある」ことにお気づきでしょうか。これは実はString#%というメソッドです。String#%は書式を設定して\dなどに渡します。標準ライブラリのメソッドなので、Rubyの構文ではありません。"で囲まれた文字列では、この%メソッドがないとエラーになります。カンマを置いてもだめです。end-of-inputメソッドである証拠に、以下のように"文字列".%と書いても動作は変わりません。"文字列"はメソッドのレシーバーということになります。10.0実を言うと、この2番目の%が何なのかわからなかったのでこの記事を書いたのでした。printfメソッドやsprintfメソッドの引数の形になっていれば、以下のように%メソッドとカンマ,区切りのどちらでも書けます。10"%を使った書式指定について詳しくは以下の公式ドキュメントを参照いただければと思います。2.6.0)String#%メソッドへの3種類の引数渡し方法ここでは、String#%メソッドへの引数渡しについてまとめます。同ドキュメントの末尾で「利用頻度が低いので最後に説明します」と記載されていますが、そこそこ利用されているように思えます。10.0の引数10.0は、実際には配列として扱われます。]などで配列リテラルにすることで渡せます。Rubyでは引数を囲む丸かっこを省略できます。2.000000"もちろん引数が1つの場合も配列の形にできます。引数が1つであれば[]は省略できます。囲まないとカンマ区切りを正しく処理できません。丸かっこ()で囲むだけではダメです。')'もちろん、配列を変数に入れて渡すのはOKです。以下のように、ハッシュの形式で引数を渡すことで、名前付き引数的に値を渡せます。%<名前>という<>を使った書式であり、直後にprintf系のフォーマット指定文字を追加できます。}具体的には以下のように使います。String#%メソッドは省略できません。ハッシュが1つであっても必要です。ブロックではないのでdo–endには置き換えられません。end-of-inputこれも、ハッシュを変数に入れて渡すのはOKです。2.000000"フォーマット指定文字は省略できません。省略してもエラーにはなりませんが、値は出力されず、%だけが生で出力されてしまいます。}を使った書式でも名前付き引数的にハッシュで値を渡せます。こちらの場合、printf系のフォーマット指定文字は使えません。2.0"もっともここまでくると、以下のように普通に式展開を使う方がよい気もしますが、ハッシュで値をまとめて渡せるのはメリットかもしれませんね。Range#stepのエイリアスとしての%(2.6〜)以下の記事を見て気が付きました?。9]記法上()が不可欠になります。上に登場したprintfやsprintfの書式指定は、どうもRubyっぽくありません。その理由は、これらのメソッドの書式はC言語の同名の関数を踏襲しているからです。正確には、Rubyでprintfメソッドやsprintfを呼び出すとC言語の機能が呼び出されるのですが、完全な丸投げではなく、sprintfについてはC言語と若干の違いがあるとのことです。言語のsprintf(3)のものと同じです。3桁区切り)などの違いがあります。xのように指定します。ruby-lang.orgよりRuby公式ドキュメントから、printfのサンプルを引用します。非常に生々しいですね。"..4294967173"printfやsprintf固有の%記号の使われ方については長くなりすぎるので本記事では触れず、以下のリンクにとどめることにします。使い方まとめhttps://t.co/9h1behNxsS%ってよく忘れるから、ありがたい記事だった。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。