关于ruby:%w(array)是什么意思?

What does %w(array) mean?

我正在查看fileutils的文档。我对下面这句话感到困惑:

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

%w是什么意思?你能给我指一下文件吗?


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


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

还有其他%文字:

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

我不认识其他人,但可能有人潜伏在那里…


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

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

自从Ruby2.0.0以来,您还拥有:

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

%W%W允许您不使用引号和逗号创建字符串数组。


虽然这是一篇老文章,但问题不断出现,我觉得答案并不总是很清楚,所以,我的想法是:

%W%W是与数组相关的一般定界输入类型的示例。还有其他类型,包括%q%q%r%x%i

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

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

要获得包含%W和完整列表、转义字符和分隔符示例的完整报告,请查看"ruby-%w vs%w–秘密泄露!"


我们应该用%w[]代替%w()

根据Ruby样式指南:

当需要单词数组(不带空格和特殊字符的非空字符串)时,首选%w。仅将此规则应用于具有两个或多个元素的数组。

1
2
3
4
5
# bad
STATES = ['draft', 'open', 'closed']

# good
STATES = %w[draft open closed]

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

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

1
2
3
4
5
6
7
# bad
%w(one two three)
%i(one two three)

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

欲了解更多信息,请阅读此处。


摘自http://ruby doc.org/core/doc/syntax/literals_rdoc.html label percent+strings:

Besides %(...) which creates a String, the % may create other types of object. As with strings, an uppercase letter allows interpolation and escaped characters while a lowercase letter disables them.

These are the types of percent strings in ruby:
...
%w: Array of Strings


我从csv电子表格中得到了一组列,其中包含了完整的用户名,我需要保留格式和空格。我在使用Ruby时找到的最简单的方法是:

1
2
3
4
names = %( Porter Smith
Jimmy Jones
Ronald Jackson).split('
'
)

这突显了%()创建了一个类似于"Porter Smith
JimmyJones
Ronald Jackson"
的字符串,为了得到数组split,该字符串位于"
"
["Porter Smith","Jimmy Jones","Ronald Jackson"]上。

因此,为了回答OP最初的问题,如果您希望space存在于最终数组输出中时,恰好有space,那么他们也可以编写%(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')