74

我一直在阅读 Thomas 的 Programming 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 的时间不长,但我从未在生产代码中遇到过这种引用方法。

除了明显能够避免使用反斜杠在内部转义引号之外,这种引用常规单引号或双引号的方法的常见用例是什么?它们通常用于单行字符串还是多行字符串?如果在多行字符串中使用,它们是否比 HEREDOC 字符串更受青睐?是否有一个特别常见的 Ruby 习语?

4

5 回答 5

114

在您已经“用完”引用方法的情况下,它们对于使用 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://否则必须逃脱。

于 2012-04-13T16:28:31.147 回答
11

概述

除了“避免内部转义引号”和@tadman 之前提供的示例之外,还有其他用例:

  • 使用与生成器本身相同的语言自动生成代码(例如,Ruby 生成 Ruby)
  • 提供格式清晰的代码,不会混淆文本编辑器的语法高亮功能
  • 允许存储可能必须通过多个存储层的代码块(例如与网站交互的数据库,或与文本编辑器交互的片段管理系统,文本编辑器与子shell交互,等等)

细节

这种方法是一种通用且健壮的习惯用法,适用于任何类型的自动代码生成工具,包括但不限于用其他语言编写样板代码的工具,或管理 IDE 或文本编辑器的代码片段的工具.

除了@tadman 已经提供的示例之外,还有生成代码的一般情况,其中生成的代码与生成程序的代码具有相同或基本相似的语法。

在这些情况下,该解决方案不仅仅有助于避免使用反斜杠来转义引号。如果没有这样的解决方案,在某些情况下生成的代码会变得非常难以维护。

要查看这方面的示例,请随时查看以下参考资料。

参考

[参见例如,

]

于 2013-04-15T20:34:36.357 回答
5

我知道这是一个旧线程,但我在调用系统命令并想要插入一些值时在生产中使用它们,如下所示:

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

超级好用。

于 2017-06-20T19:27:32.973 回答
3

可能值得注意的是,在生成 gemspecs 时,捆绑器和珠宝商默认使用 %q 用于 gemspec 的摘要/描述部分。这可以防止某人在摘要或描述中使用引号并破坏 gemspec。

于 2013-11-30T15:32:24.793 回答
-1

当您的字符串包含单引号或双引号时,它们很有用。这种情况并不经常发生,但这种技术在发生时非常有用。

于 2012-04-13T16:29:01.977 回答