我指的是%w运算符/构造函数/无论你怎么称呼它,像这样使用:
%w{ foo bar baz }
=> ["foo", "bar", "baz"]
我有几个问题:
%w
“事物的正确名称是什么”?操作?文字?构造{}
代替[]
s?%w
内一个%w
,以便创建嵌套数组?)答案 0 :(得分:23)
1)它是一个litteral,它是%
然后是r(正则表达式),w(数组),q(字符串)等来表示不同的litteral。
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+)/
系统命令:(%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]
答案 1 :(得分:10)
不确定“官方”文档,但这非常好:http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#The_.25_Notation
您是否使用{} []()或<>除非您的字符串包含此字符,例如:
,否则无关紧要%q{a closing parenthesis: ")"}
语法非常复杂,因此记住每个变体都不是很有用,但是当你快速入侵并且想要避免手动处理转义字符时它会派上用场。
答案 2 :(得分: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/
答案 3 :(得分:1)
实际上并不确定,我想是字符串编码的文字。
不。你几乎可以使用任何角色。如果您从{
,[
或(
开始,则需要使用该字符的结束副本关闭,但其他字符将以相同的字符关闭。您可能希望使用不会出现在文字中的字符。
%w_ foo bar _
不是一个符号数组,但是单引号字符串有%q
,双引号字符串有%Q
,正则表达式有%r
,可能还有一些另外我也忘了。
不。它们用于快速简便地创建简单对象。如果需要嵌套,则需要使用更详细的语法。