Ruby 的 %q / %Q 引用方法的用例是啥?
Posted
技术标签:
【中文标题】Ruby 的 %q / %Q 引用方法的用例是啥?【英文标题】:What is the use case for Ruby's %q / %Q quoting methods?Ruby 的 %q / %Q 引用方法的用例是什么? 【发布时间】:2012-04-26 00:52:57 【问题描述】:我一直在阅读 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 习语?
【问题讨论】:
我认为是的用例。我只将 heredocs 用于多行字符串。 Heredocs 有一个很大的优势,就是您可以将 intro 放在代码链中,这样它就不会破坏使用它的代码行,例如str = <<-TEXT.lines.map(&:strip) ...
//我使用 Ruby 的时间不长,但我从未在生产代码中遇到过这种引用方法。// 这个 Ruby 语言特性可以追溯到 perl。因此,您更有可能在同时也是当前或以前的 perl 开发人员的 Rubyist 中使用它。要查找多个示例,请搜索“Perl quotelike operator”。
【参考方案1】:
我知道这是一个旧线程,但我在调用system 命令并想要插入一些值时在生产中使用它们,如下所示:
system(%Q(ffmpeg -y -i "#input_filepath" -qscale:a 2 "#output_filepath"))
超级好用。
【讨论】:
【参考方案2】:也许值得注意的是,打包器和珠宝商在生成 gemspec 时默认使用 %q,用于 gemspec 的摘要/描述部分。这可以防止某人在摘要或描述中使用引号并破坏 gemspec。
【讨论】:
【参考方案3】:概述
除了“避免内部转义引号”和@tadman 之前提供的示例之外,还有其他用例:
使用与生成器本身相同的语言自动生成代码(例如,Ruby 生成 Ruby) 提供格式清晰的代码,不会混淆文本编辑器的语法高亮功能 允许存储可能必须通过多个存储层的代码块(例如与网站交互的数据库,或与文本编辑器交互的 sn-ps 管理系统,文本编辑器与子外壳交互,等等)详情
这种方法是一种通用且稳健的习惯用法,适用于任何类型的自动代码生成工具,包括但不限于用其他语言编写样板代码的工具,或管理代码 sn-ps 的工具IDE 或文本编辑器。
除了@tadman 已经提供的示例之外,还有生成代码的一般情况,其中生成的代码与生成程序的代码具有相同或基本相似的语法。
在这些情况下,该解决方案不仅仅有助于避免使用反斜杠来转义引号。如果没有这样的解决方案,在某些情况下生成的代码会变得非常难以维护。
要查看这方面的示例,请随时查看以下参考资料。
参考文献
[参见例如,
http://en.wikipedia.org/wiki/Leaning_toothpick_syndrome http://c2.com/cgi/wiki?QuineProgram http://en.wikipedia.org/wiki/Delimiter#Delimiter_collision http://en.wikipedia.org/wiki/Quine_(computing)]
【讨论】:
【参考方案4】:当您的字符串包含单引号或双引号时,它们很有用。这种情况并不经常发生,但这种技术在发生时非常有用。
【讨论】:
操作员说他想知道除了“避免内部转义引号”。【参考方案5】:在您已经“用尽”引用方法的情况下,它们对于使用 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 字符串或整个外部字符串)被引用和转义。 HEREDOC 风格在声明变量时是可以的,但在用作方法的参数时非常难看,尤其是当你试图提供两个不同的变量时论据。对于外行来说,它们非常令人困惑。以上是关于Ruby 的 %q / %Q 引用方法的用例是啥?的主要内容,如果未能解决你的问题,请参考以下文章
target_include_directories 上的生成器表达式的用例是啥?
cudaGraphicsGLRegisterImage中cudaGraphicsRegisterFlagsWriteDiscard的用例是啥?