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

时间:2010-11-26 17:43:55

标签: ruby

Ruby语言的大部分是方法而不是语法,因此我希望找到%q%w等,定义为Kernel类中的方法。但是,他们不在那里。

那么他们在哪里定义?它们是语言关键词吗?

4 个答案:

答案 0 :(得分:30)

Programming Rubychapter about strings中提及它们。

%q{}%Q{}相关的

%{},与%Q{}相同。此外,我显示的分隔符“{}”可以是一对匹配的分隔符,因此您可以使用[]()等。%q{}与使用单个分隔符相同-quotes来分隔字符串。 %Q{}与使用双引号相同,允许插入嵌入字符串:

%q{foobar} # => "foobar"
%Q{foobar} # => "foobar"

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

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

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

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

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

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

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

最后有%x{}就像反引号一样,即“``”,将字符串传递给底层操作系统。把它想象成“exec”:

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

许多Ruby对这些快捷方式的想法来自Perl,只有在Perl中他们使用q{}qq{}qw{}qx{}qr{}。前导q代表“引用”,如果我没记错的话,它们会被视为“引用”操作符。 Ruby的文档需要扩展,这组特定的工具肯定可以使用一些帮助。

答案 1 :(得分:25)

它们在解析器中被“硬编码”;见

查找相关代码的最简单方法是查找第二次出现的str_sword(单引号WORD)。所有“分隔输入”语法都在那里定义:%Q%q%W%w%x%r和{{ 1}}(上面引用的两个版本都定义了相同的分隔输入标记集)。

答案 2 :(得分:4)

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

答案 3 :(得分:1)

  

[本说明是对Will和Tin之间讨论的回应   男人在2012年5月30日关于regexp文字的主题看起来像   Ruby文档中的“%r ... /”。我似乎无法添加评论   直接讨论,但也许是适当的人   privs可以在那里移动这些信息....]

一般的Ruby类文档是根据所讨论的每个类的源代码中的RDoc注释生成的。这些源注释具有正则表达式文字的正确语法,如查看通过ri Regexp显示的文本文档,使用本地生成的HTML版本的文档等时可以看到的。

但是,在今年春天的一段时间内,用于生成www.ruby-doc.org上的文档页面的RDoc版本包含导致regexp文字显示为{的错误{1}}代替"%r.../"。但是,截至6月9日,该错误已得到纠正,“核心”和“std-lib”页面被重新生成,因此正则表达式文字在该网站上再次正确显示。

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