929

我正在查看 FileUtils 的文档。

我对以下行感到困惑:

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

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

4

8 回答 8

1361

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

于 2009-08-13T21:28:14.213 回答
540

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

这是所有 % 文字

  • %w()字符串数组
  • %r()正则表达式。
  • %q()细绳
  • %x()一个 shell 命令(返回输出字符串)
  • %i()符号数组(Ruby >= 2.0.0)
  • %s()象征
  • %()(不带字母)的快捷方式%Q()

分隔符(and)可以替换为很多变体,例如[and ], |,!等。

使用大写字母%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"]
于 2009-08-13T23:06:39.920 回答
60

还有%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...
于 2011-07-23T20:16:09.157 回答
33

%W%w允许您在不使用引号和逗号的情况下创建字符串数组。

于 2009-08-13T21:28:52.540 回答
25

虽然这是一个旧帖子,但问题不断出现,答案对我来说并不总是很清楚,所以,这是我的想法:

%w并且是与数组相关的通用分隔输入类型%W的示例。还有其他类型,包括、、和。%q%Q%r%x%i

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

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

如需完整的示例%w和完整列表、转义字符和分隔符,请查看“ Ruby - %w vs %W - 揭秘!

于 2014-05-30T08:00:46.363 回答
20

而不是%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]

更多信息请阅读这里

于 2017-05-26T07:46:47.930 回答
12

摘自http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings的百分比字符串文档:

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

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

于 2015-03-13T07:44:01.400 回答
2

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

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

这突出显示了%()创建一个类似字符串"Porter Smith\nJimmyJones\nRonald Jackson"并获取数组split的字符串"\n" ["Porter Smith", "Jimmy Jones", "Ronald Jackson"]

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

于 2017-09-08T15:32:58.513 回答