Ruby'的用例是什么;s%q/%q报价方法?

Ruby'的用例是什么;s%q/%q报价方法?,ruby,string,quotes,Ruby,String,Quotes,我一直在阅读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的时间不长,但我从未在生产代码中遇到过这种引用方法 除了明显能够避免使用反斜杠在内部转义引号之外,这种引用常规单引号或双引号的方法有哪些常见用

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


除了明显能够避免使用反斜杠在内部转义引号之外,这种引用常规单引号或双引号的方法有哪些常见用例?它们通常用于单行字符串还是多行字符串?如果在多行字符串中使用,它们是否比herdoc字符串更受欢迎?有一种常见的Ruby习惯用法吗?

它们对于使用JavaScript转义HTML非常有用,因为您已经“用完”了引用方法:

link = %q[<a href="javascript:method('call')">link</a>]
这样做的好处是,您不需要注意查询中使用的引用类型。它将与单、双或两者一起工作。他们也比HEREDOC风格的方法少了很多麻烦


Ruby还提供了其他类似这样的方便方法,比如可以构造正则表达式的
%r
。当试图编写一个处理像
http://
这样必须转义的内容时,这避免了斜杠。当字符串包含单引号或双引号时,斜杠非常有用。这种情况并不经常发生,但这种技术在发生时非常有用。

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

  • 使用与生成器本身相同的语言自动生成代码(例如,Ruby生成Ruby)
  • 提供格式清晰的代码,不会混淆文本编辑器的语法突出显示功能
  • 允许存储可能必须通过多个存储层的代码块(例如与网站交互的数据库,或与文本编辑器交互的代码段管理系统,后者与子shell交互,等等)
细节 这种方法是一种通用且健壮的习惯用法,适用于任何类型的自动代码生成工具,包括但不限于用其他语言编写样板代码的工具,或为IDE或文本编辑器管理代码段的工具

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

在这些情况下,解决方案的作用远远不止于避免使用反斜杠转义引号。如果没有这样的解决方案,在某些情况下,生成的代码可能极难维护

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

工具书类 [见例如:


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

我知道这是一个旧线程,但我在生产中调用命令并希望插入一些值时使用了它们,如:

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

超级方便。

我认为这就是用例。我只对多行字符串使用herdocs。herdocs有一个很大的优势,就是你可以将简介放在一个代码链中,这样它就不会在使用它的地方打断代码行,比如在
str=//我已经很久没有使用Ruby了,但是我从未在生产代码中遇到过这种引用方法。//这个Ruby语言特性可以追溯到perl。因此,您很可能会在Rubyists中发现这一点,这些Rubyists也是当前或以前的perl开发人员。要找到几个示例,请搜索“Perl quotelike操作符”。op说他想知道的不是“避免内部转义引号”。我没有考虑的JavaScript示例-内部引号的功能在语法上有重要意义,并且会混淆哪个上下文(标记属性、JS字符串或整个外部字符串)当前正在被引用和转义。当声明变量时,HEREDOC样式是可以的,但当用作方法的参数时,它非常难看,特别是当您试图将其中两个作为不同的参数提供时。对于未初始化的人来说,它们非常容易混淆。
 system(%Q(ffmpeg -y -i "#{input_filepath}" -qscale:a 2 "#{output_filepath}"))