Ruby语言中的%q,%w等定义了什么?

Where in the Ruby language is %q, %w, etc., defined?

Ruby语言中有很多是方法而不是语法,所以我希望找到%q%w等,定义为Kernel类中的方法。但是,他们不在那里。

那么它们是在哪里定义的呢?它们是语言关键字吗?


编程Ruby在关于字符串的章节中提到了它们。

%q{}%q{}有关的是%{},与%q{}相同。另外,我显示的分隔符"{}可以是一对匹配的分隔符,所以可以使用[]()等。%q{}与使用单引号分隔字符串相同。%q{}与使用双引号相同,允许插入嵌入字符串:

1
2
3
4
5
6
%q{foobar} # =>"foobar"
%Q{foobar} # =>"foobar"

asdf = 'bar' # =>"bar"
%q{foo#{asdf}} # =>"foo\#{asdf}"
%Q{foo#{asdf}} # =>"foobar"

另外,还有%w{},它使用空格将字符串拆分为一个数组。例如:

1
%w[a b c] # => ["a","b","c"]

%w{}不插入嵌入变量:

1
2
%w[a b asdf] # => ["a","b","asdf"]
%w[a b #{asdf}] # => ["a","b","\#{asdf}"]

以及定义正则表达式的%r{}

1
%r{^foo}.class # => Regexp

最后是%x{},它的作用类似于倒计时,即"``",将字符串传递给底层操作系统。把它想象成"执行官":

1
2
%x{date} # =>"Fri Nov 26 15:08:44 MST 2010
"

Ruby对这些快捷方式的很多想法都来自Perl,只有在Perl中,他们才使用q{}qq{}qw{}qx{}qr{}。领先的q代表"Quote",如果我记得对的话,它们被视为"Quote"操作符并记录在案。Ruby的文档需要扩展,这组特定的工具肯定会用到一些帮助。


它们在解析器中是"硬编码的";请参见

  • 从Ruby1.9.2的尖端解析.y,或者
  • 从Ruby1.8.7的尖端解析.y。

找到有问题的代码的最简单方法是查找第二次出现的str_sword(单引号)。这里定义了所有"定界输入"语法:%Q%Q%W%W%x%r%s(上述两个版本定义了相同的定界输入标记集)。


它们不是关键字,而是宏。很难找到他们的官方参考资料,但这里有一个。


[This note is in response to the discussion between Will and the Tin
Man on May 30, 2012 on the topic of regexp literals looking like
"%r.../" in the Ruby docs. I don't seem to be able to add a comment
directly to that discussion, but perhaps someone with appropriate
privs can move this info over there....]

一般的Ruby类文档是从RDoc注释生成的,这些注释内置于每个相关类的源代码中。这些源注释对于正则表达式文本具有正确的语法,正如在查看通过ri Regexp显示的文本文档时所看到的,使用本地生成的文档HTML版本等。

然而,在今年春天的一段时间里,用于在www.ruby-doc.org上生成文档页面的RDoc版本包含了一个错误,导致regexp文本显示为"%r.../",而不是"/.../"。不过,截至6月9日,该错误已被纠正,"core"和"std lib"页面已重新生成,因此regexp文本再次正确显示在该站点上。

(网站上还有其他类别的文档是单独生成的,但是如果这些页面中的任何一页仍然显示不正确的格式,那么在最终重建时,它们也应该得到修复。)