文字列の書式設定では引用符内で書式設定以外の`%`記号を`%%`とエスケープすること|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。今回の記事を書くために、まず%(パーセント)記号と式展開についてそれぞれ別記事にまとめましたので先に以下をご覧ください。しないと自分が混乱してしまうので。sprintfやString#%メソッドを使う場合の%文字のエスケープこの部分はRubyのバージョンに限らず共通です。RubyのsprintfやString#%メソッドを用いて書式設定を行う場合、引用符内で%そのものを出力したい場合は%%とすることでエスケープされます(エラーメッセージでも%%を使えと書かれてますね)。面白いことに、%%による%のエスケープは二重引用符でも一重引用符でも使えます。本記事では簡単のためString#%メソッドのみを用いています。instead逆に、バックスラッシュ%では二重引用符/一重引用符にかかわらず、%をエスケープできません。insteadただしsprintfやString#%メソッドを使っていなければ、二重引用符内で通常どおり%でエスケープできます。一重引用符では式展開もエスケープも無効になります。おなじみの挙動ですね。SQLのLIKEで使われる%さらにややこしいのが、SQLのLIKEでは%を一種のワイルドカード的に使えるという点です。'%name%';上はnameカラムが「なんちゃらnameなんちゃら」の行を取得します。「なんちゃら」は長さゼロも含みます。2.5で引用符内の%の挙動が変わったのはsprintfに関連する場合です(String#%で書式を設定する場合を含む)。以下の3つの場合が考えられます(簡単のためString#%の書式に揃えました)。値}で渡すことになっています。3.の%{名前付き変数}では書式は設定できないので、実は普通の式展開でやっても同じだったりします。詳しくは以下の記事をご覧ください。使い方まとめここまでを押さえたところで、冒頭のSlackに出てきたRubyコードを再録します。}%は左から順に以下の意味になります。String#%メソッド(書式設定用)上ではSQLで使う%%や%がどちらも使えてしまっている点にご注目ください。後述のツイートにあるように、これは本来の挙動ではありませんでした。ここでは%の後ろがたまたま%や'だったおかげで、%が書式設定用ではないとRubyに認識されただけと考えられます。したがって、以下のようにエスケープなしの%の後ろに文字があるとエラーになります。namedつまり、String#%で書式を整える場合は、Rubyのバージョンにかかわらず、エスケープなしの%を引用符に書かない方がよいということになります。引用符内の単独の%は、Rubyのバージョンや文字列内の位置で挙動が変わるので当てにしない方がよいと思います。}%は左から順に以下の意味になります。2.4.x以前との違いは、%%というエスケープが必須になったことです。namedここからわかるように、引用符内では書式設定と無関係な%を常に%%とエスケープすることで、バージョンや位置にかかわらず問題なく動作するようになります。結論String#%で書式を整える場合は、Rubyのバージョンにかかわらず、引用符の中で書式設定と無関係な%は%%とエスケープすること。2018↑やはり2.5で挙動が修正されたそうです。「ハッカソンのプルリク」がどれなのかはわからずじまい?。記号はほんとググりにくい。バージョンごとの挙動Rubyのバージョンごとの挙動を改めて調べてみました。}だけがすべてのRubyバージョンで正常に動作します。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。