红宝石中%w“东西”是什么?

时间:2011-03-29 16:32:25

标签: ruby

我指的是%w运算符/构造函数/无论你怎么称呼它,像这样使用:

%w{ foo bar baz }
=> ["foo", "bar", "baz"]

我有几个问题:

  • %w“事物的正确名称是什么”?操作?文字?构造
  • 我是否使用{}代替[] s?
  • 是否重要?
  • 还有其他类似的东西(例如,一个会给你一个符号数组的东西)吗?
  • 它们是否可以嵌套(在%w内一个%w,以便创建嵌套数组?)
  • 我在哪里可以找到有关它的文档?

4 个答案:

答案 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“东西”的正确名称是什么?操作?文字?构造

实际上并不确定,我想是字符串编码的文字。

  • 我是否使用{} s代替[] s?

不。你几乎可以使用任何角色。如果您从{[(开始,则需要使用该字符的结束副本关闭,但其他字符将以相同的字符关闭。您可能希望使用不会出现在文字中的字符。

%w_ foo bar _
  • 还有其他类似的东西(例如,一个会给你一个符号数组的东西)吗?

不是一个符号数组,但是单引号字符串有%q,双引号字符串有%Q,正则表达式有%r,可能还有一些另外我也忘了。

  • 它们可以“嵌套”(另一个%w中的一个%w,以便创建嵌套数组)?

不。它们用于快速简便地创建简单对象。如果需要嵌套,则需要使用更详细的语法。