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


72

我一直在阅读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惯用法?


4
我认为这用例。我只将heredocs用于多行字符串。
戴夫牛顿

1
Heredocs具有很大的优势,您可以将简介放在代码链中,这样就不会破坏使用代码的地方,例如str = <<-TEXT.lines.map(&:strip) ...
Niklas B.

1
//我已经很长时间没有使用Ruby了,但是我在生产代码中从未遇到过这种引用方法。///这种Ruby语言功能可以追溯到perl。因此,您更有可能在现在或以前的perl开发人员的Rubyists中使用此方法。要找到几个示例,请搜索“ Perl quotelike operator”。
dreftymac

Answers:


112

在您已经用完引号方法的地方,它们对于用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://


我没有考虑过的JavaScript示例-内部引用的功能在语法上很重要,并且使当前引用和转义的上下文(标记属性,JS字符串或整个外部字符串)变得混乱。
Michael Berkowski 2012年

声明变量时,HEREDOC样式还可以,但是当用作方法的参数时,特别丑陋,尤其是当您尝试提供两个作为不同参数时。他们对初学者很困惑。
tadman

10

总览

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

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

细节

此方法是一种通用且健壮的习惯用法,可与执行自动代码生成的任何类型的工具配合使用,包括但不限于以其他语言编写样板代码的工具或为IDE或文本编辑器管理代码段的工具。

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

在这些情况下,该解决方案在避免使用反斜杠转义引号方面的作用远远超过了帮助。如果没有这样的解决方案,在某些情况下,生成的代码将变得极难维护。

要查看其示例,请随时阅读以下参考。

参考文献

[例如

]


3

可能值得注意的是,在生成gemspec时,捆绑程序和珠宝商默认使用%q来表示gemspec的摘要/说明部分。这样可以防止某人在摘要或说明中使用引号并破坏gemspec。


3

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

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

超级好用。


-1

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


1
这位操作人员说,除了“避免内部转义的引号”之外,他还想了解其他信息。
xdazz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.