在 Ruby 中,%w 是什么意思?

23
我指的是%w操作符/构造器/无论你如何称呼它,可以像这样使用:
%w{ foo bar baz }
=> ["foo", "bar", "baz"]

我有几个问题:

  • 那个%w的正式名称是什么?操作符?字面量?构造函数?
  • 使用{}而不是[]是否有影响?
  • 还有其他类似的东西吗(例如,一个能够给你提供符号数组的)?
  • 它们可以嵌套吗(一个%w在另一个%w内,以创建嵌套数组)?
  • 在哪里可以找到相关文档?

有点相关的是:Raku称之为Q lang,但它使用的不是%,而是Q,例如Q[A literal string]Q:ww{a list of words}(或其简写形式<a list of words>),等等。 - uzluisf
4个回答

31

1) 这是一个字面量,其中%后跟r(正则表达式)、w(数组)、q(字符串)等不同的字面量。

2)

ruby-1.9.2-p136 :001 > %w{1 2 3}
 => ["1", "2", "3"] 
ruby-1.9.2-p136 :002 > %w[1 2 3]
 => ["1", "2", "3"] 

ruby-1.9.2-p136 :008 > %w!a s d f!
 => ["a", "s", "d", "f"] 

ruby-1.9.2-p136 :009 > %w@a s d f@
 => ["a", "s", "d", "f"] 

因此,您可以看到只要标记内容的开头和结尾,就可以使用任何字符。

3)

以下是其他一些示例:

字符串:(%q或%Q)

ruby-1.9.2-p136 :016 > %Q[ruby is cool]
 => "ruby is cool" 
ruby-1.9.2-p136 :017 > %q[ruby is "cool"]
 => "ruby is \"cool\"" 

正则表达式:(%r)

ruby-1.9.2-p136 :019 > %r[(\w+)]
 => /(\w+)/ 

Sys命令:(%x)

ruby-1.9.2-p136 :020 > %x[date]
 => "Tue Mar 29 12:55:30 EDT 2011\n"

4)它们不能嵌套,因为%w表示分隔的白空格数组。因此,如果您尝试进行多层次的操作,会出现以下情况:

ruby-1.9.2-p136 :003 > %w{1 %w{2 3 4} 5}
 => ["1", "%w{2", "3", "4}", "5"] 
为了实现这个目标,你需要使用更冗长的语法:
ruby-1.9.2-p136 :011 > [1, [2,3,4], 5]
 => [1, [2, 3, 4], 5] 

感谢您抽出时间回答。不过,Taum提供的链接更加完整。还是要感谢您的努力。 - kikito

13

虽然不确定官方文档,但这个链接很好:http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#The_.25_Notation

无论您使用 {} [] () 还是 <>,都没有关系,除非您的字符串包含此字符,例如:

%q{a closing parenthesis: ")"}

语法相当复杂,因此记住每种变体并没有太大的用处,但当您需要快速进行编码且希望避免手动处理转义字符时,它可能会派上用场。


那个链接非常好地回答了我的问题。谢谢! - kikito
如果它们匹配,您可以在字符串中使用相同的分隔符:str = %q(hello (world)) #=> "hello (world)" - steenslag

8

你可以使用各种形式的字面语法,几乎任何成对的分隔符都可以,参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html

%w[one two three] # == ["one", "two", "three"]

%[one two three] # == "one two three"
%[one "two" three] # == "one \"two\" three"

%r[one two three] # == /one two three/

1
  • 那个 %w "thing" 的正确名称是什么?操作符?字面量?构造函数?

其实不太确定,我猜是字符串编码的字面量。

  • 使用 {} 而不是 [] 有关系吗?

没有关系。实际上你可以使用几乎任何字符。如果你以 {[( 开头,你需要用相应的关闭字符来结束,但其他字符则使用相同的字符来结束。你可能想使用一个在字面量中不会出现的字符。

%w_ foo bar _
  • 还有其他类似的东西吗(例如,提供符号数组的东西)?

没有提供符号数组的,但是有%q用于单引号字符串,%Q用于双引号字符串,%r用于正则表达式,还有可能有其他我忘记的。

  • 它们可以“嵌套”吗(一个%w在另一个%w内,以创建嵌套数组)?

不行。它们是为了快速简便地创建简单对象。如果需要嵌套,则需要使用更冗长的语法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接