"%w(array)" 是什么意思?

977

我在查看FileUtils的文档。

我对下面这行内容感到困惑:

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

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


1
这回答了你的问题吗?在Ruby中,%w "thing"是什么? - aerijman
8个回答

1423

%w(foo bar)["foo", "bar"] 的缩写。这意味着它是一种用空格分隔字符串的数组的表示方法,而不需要在它们周围加上引号或用逗号分隔。您可以在zenspider的快速参考中找到其他字面量的写法。


221
括号可以是几乎任何其他字符,例如方括号 %w[...]、花括号 %w{...},甚至是感叹号 %w!...!。所有这些都有相同的行为(返回一个数组)。 - ryanb
169
记住这个意思最简单的方法是“空格(w)分隔的数组”。 - Julik
10
请参阅此处的“通用分隔输入”http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html - Jared Beck
139
如果字符串中有空格,只需用 \ 进行转义。例如:%w(ab\ c def) # => ["ab c", "def"] - Dmytro
10
这个页面也可以解决这个问题:http://www.ruby-doc.org/core-2.0/doc/syntax/literals_rdoc.html#label-Percent+Strings - TheConstructor
显示剩余13条评论

584

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

这里是所有 % 字面量:

  • %w() 字符串数组
  • %r() 正则表达式。
  • %q() 字符串
  • %x() shell 命令 (返回输出的字符串)
  • %i() 符号数组 (Ruby >= 2.0.0)
  • %s() 符号
  • %()(没有字母)是 %Q() 的快捷方式

定界符 () 可以替换为许多变化形式,如 []|!等等。

当使用大写字母 %W() 时,您可以使用字符串插值 #{variable},类似于 "' 字符串定界符。该规则对所有其他 % 字面量也适用。

abc = 'a b c'
%w[1 2#{abc} d] #=> ["1", "2\#{abc}", "d"]
%W[1 2#{abc} d] #=> ["1", "2a b c", "d"]

37
从 Ruby 2.0.0 开始,你也可以使用 %i() 来生成一个符号数组。 - David Tuite
13
还有 %()(或 %[]%{})可以创建带有双引号并转义双引号的字符串,类似于 %Q()。例如 %("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>" - Dennis
2
@ChristopherOezbek %i[nterned] 怎么样?因为符号是内部化的字符串。 - Shane Creighton-Young

61

还有%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...

34

9
关于 %W 和 %w 的区别,请查看 https://dev59.com/S3RB5IYBdhLWcg3wNk53。 - Jan Hettich

28

虽然这是一篇旧帖子,但问题仍然存在,并且答案对我来说并不总是很清楚,因此这是我的想法:

%w%W是通用限定输入类型的示例,与数组相关。还有其他类型,包括%q%Q%r%x%i

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

使用的分隔符可以是任何字符,而不仅仅是开放括号。尝试以上示例,查看其效果。

有关%w及其完整列表、转义字符和分隔符的完整说明,请参阅“Ruby - %w vs %W – secrets revealed!


24

我们应该使用%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]

更多内容请阅读此处


2
如果您在Rubocop中看到错误,这就是它正在寻找的符号。 - Jason L.

13

2
哎呀,谢谢!我开始觉得它不存在了。其他人提供的rubydoc链接已经失效了。 - Gerry
这些文档在相当长的一段时间内没有包含在RubyDocs中。 - the Tin Man

1

我收到了一份包含用户全名的CSV电子表格的列,需要保留空格和格式。在使用ruby的过程中,我发现最简单的方法是执行以下操作:

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

这表明%()创建了一个字符串,例如"Porter Smith\nJimmyJones\nRonald Jackson",要获取数组,您需要在"\n"上对字符串进行split操作:["Porter Smith", "Jimmy Jones", "Ronald Jackson"] 因此,为了回答OP的最初问题,如果在希望空格存在于最终数组输出中时出现space,他们可以编写%(cgi spaeinfilename.rb;complex.rb;date.rb).split(';')

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