Ruby 的% q/% Q 引用方法的用例是什么?

我一直在阅读 Thomas 的《编程 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 成语,它们在那里很常见?

39484 次浏览

它们对于使用 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://这样的东西的函数时出现斜杠现象,否则这些函数就必须被转义。

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

概述

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

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

细节

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

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

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

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

参考文献

[参见,

]

也许值得注意的是,在生成 gemspec 时,默认情况下,bundler 和 Jeweler 使用% q 作为 gemspec 的摘要/描述部分。这可以防止有人在摘要或描述中使用引号并破坏 gemspec。

我知道这是一个老线程,但我在生产环境中调用 系统命令并插入一些值时使用过它们,比如:

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

超级方便。