%w(数组)是什么意思?

时间:2009-08-13 21:23:47

标签: ruby arrays string notation

我正在查看FileUtils的文档。我对以下几行感到困惑:

FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'

%w是什么意思?你能指点我的文件吗?

8 个答案:

答案 0 :(得分:1145)

%w(foo bar)["foo", "bar"]的快捷方式。这意味着它是一种表示字符串数组的符号,这些字符串由空格而不是逗号分隔,并且没有引号。您可以在zenspider's quickref中找到编写文字的方法列表。

答案 1 :(得分:438)

我认为%w()是一个“单词数组” - 元素由空格分隔,并返回一个字符串数组。

还有其他%文字:

  • %r()是另一种编写正则表达式的方法。
  • %q()是另一种编写单引号字符串的方法(可以是多行的,这很有用)
  • %Q()提供双引号字符串
  • %x()是一个shell命令
  • %i()给出一系列符号(Ruby> = 2.0.0)
  • %s()foo变为符号(:foo

我不认识任何人,但可能有一些潜伏在那里...

答案 2 :(得分:57)

还有%s允许您创建任何符号,例如:

%s|some words|          #Same as :'some words'
%s[other words]         #Same as :'other words'
%s_last example_        #Same as :'last example'

从Ruby 2.0.0开始,你也有:

%i( a b c )   # => [ :a, :b, :c ]
%i[ a b c ]   # => [ :a, :b, :c ]
%i_ a b c _   # => [ :a, :b, :c ]
# etc...

答案 3 :(得分:31)

%W and %w允许您创建一个字符串数组,而不使用引号和逗号。

答案 4 :(得分:19)

虽然这是一篇很老的帖子,但问题仍然存在,而且答案对我来说似乎并不清楚,所以,这就是我的想法:

%w%W是与数组相关的常规分隔输入类型的示例。还有其他类型包括%q%Q%r%x%i

大写和小写版本之间的区别在于它使我们能够访问单引号和双引号的功能。使用单引号和(小写)%w,我们没有代码插值(#{someCode})和有效范围的转义字符(\\\n)。使用双引号和(大写)%W,我们可以访问这些功能。

使用的分隔符可以是任何字符,而不仅仅是左括号。玩上面的例子,看看它是否有效。

有关%w示例和完整列表,转义字符和分隔符的完整记录,请查看" Ruby - %w vs %W – secrets revealed!"

答案 5 :(得分:13)

我们应该使用%w()

而不是%w[]

根据Ruby风格指南:

当您需要一个单词数组(非空字符串,其中没有空格和特殊字符)时,首选%w到文字数组语法。仅将此规则应用于具有两个或更多元素的数组。

# bad
STATES = ['draft', 'open', 'closed']

# good
STATES = %w[draft open closed]

使用最适合各种百分比文字的大括号。

[]用于数组文字(%w, %i, %W, %I),因为它与标准数组文字对齐。

# bad
%w(one two three)
%i(one two three)

# good
%w[one two three]
%i[one two three]

更多阅读here

答案 6 :(得分:11)

摘自http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings上的Percent Strings文档:

  

除了创建String的%(...)之外,%可以创建其他类型的对象。与字符串一样,大写字母允许插值和转义字符,而小写字母则禁用它们。

     

这些是ruby中字符串百分比的类型:
  ...
  %w :字符串数组

答案 7 :(得分:1)

我从一个用户全名的CSV电子表格中获得了一堆专栏,我需要保留格式,并留空格。我发现使用ruby时让他们进入的最简单方法是:

names = %( Porter Smith
Jimmy Jones
Ronald Jackson).split('\n')

这突出显示%()创建了一个类似"Porter Smith\nJimmyJones\nRonald Jackson"的字符串,并通过split "\n"

获取["Porter Smith", "Jimmy Jones", "Ronald Jackson"]字符串

因此,为了回答OP的原始问题,如果您希望%(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')存在于最终数组输出中时,他们可能已经写了space