web-dev-qa-db-ja.com

Rubyの%q /%Q引用メソッドの使用例は何ですか?

私はトーマスのプログラミングRuby 1.9を読んでいて、代替の区切られた単一引用符と二重引用符のメソッド(%q / %Q)。私は他のRuby言語参照からもそれらを知っています。

%q/I'm acting like a single-quoted string/

%Q|"I'm acting like a double-quoted string" --Anonymous|

私は長い間Ruby=を扱っていませんでしたが、neverは本番コードでこの引用方法に遭遇しました。

内部で引用符をエスケープしないバックスラッシュを使用する明白な機能以外に、通常の単一引用符または二重引用符を引用するこの方法の一般的な使用例は何ですか?通常、単一または複数行の文字列で使用されますか?複数行の文字列で使用される場合、それらはHEREDOC文字列よりも優先されますか?よくある特定のRubyイディオムはありますか?

70

それらは、引用メソッドをすでに「使い果たした」JavaScriptでHTMLをエスケープするのに非常に便利です。

link = %q[<a href="javascript:method('call')">link</a>]

また、複数行のSQLステートメントを操作するときに非常に便利であることがわかりました。

execute(%Q[
  INSERT INTO table_a (column_a)
    SELECT value
      FROM table_b
      WHERE key='value'
])

利点は、クエリ内で使用される引用の種類に注意を払う必要がないことです。シングル、ダブル、またはその両方で動作します。また、HEREDOCスタイルの方法よりもはるかに簡単です。

Rubyは、正規表現を作成できる%rなど、このような他の便利なメソッドを提供します。そうしないと、エスケープする必要があるhttp://のようなものを処理するものを作成しようとするときに、スラッシュ炎を回避できます。

109
tadman

概要

「内部的に引用符をエスケープすることを回避する」と@tadmanによって以前に提供された例とは別に、他のユースケースもあります。

  • ジェネレーターと同じ言語でコードを自動生成します(例:Ruby生成Ruby)
  • テキストエディタの構文強調表示機能を混乱させない、きれいにフォーマットされたコードを提供する
  • 複数のストレージレイヤーを通過する必要のあるコードブロックのストレージを許可します(Webサイトとやり取りするデータベースや、サブシェルとやり取りするテキストエディターとやり取りするスニペット管理システムなど)

詳細

このアプローチは、他の言語でボイラープレートコードを記述するツールやIDEまたはテキストエディタ。

@tadmanによって既に提供されている例に加えて、生成されるコードが生成プログラムのコードと同じまたは実質的に類似の構文であるコードを生成する一般的なケースがあります。

これらの場合、ソリューションは引用符をエスケープするためのバックスラッシュの使用を回避するのに役立つだけではありません。このような解決策がないと、生成されたコードの保守が非常に難しくなる場合があります。

この例を見るには、以下の参考文献をご覧ください。

参照資料

[たとえば、

]

10
dreftymac

おそらく、gemspecのsummary/descriptionセクションに対して、gemspecsを生成するときに、デフォルトで%qがバンドラーとジュエラーによって使用されることに注意する価値があります。これにより、誰かが要約または説明で引用符を使用し、gemspecを破ることができなくなります。

3
Dan Garland

私はこれが古いスレッドであることを知っていますが、 system コマンドを呼び出していくつかの値を補間したいときに、本番環境でそれらを使用しました:

 system(%Q(ffmpeg -y -i "#{input_filepath}" -qscale:a 2 "#{output_filepath}"))

とても便利です。

3
Ryan Rebo