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

我正在查看FileUtils的留档。

我被下面这句话弄糊涂了:

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

%w是什么意思?你能指给我留档吗?

452168 次浏览

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

#0和#1允许您在不使用引号和逗号的情况下创建字符串数组。

我认为%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"]

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

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

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

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

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

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

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

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

这些是ruby中百分比字符串的类型:

%w:字符串数组

而不是%w(),我们应该使用%w[]

根据Ruby风格指南:

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

# badSTATES = ['draft', 'open', 'closed']
# goodSTATES = %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]

更多阅读这里

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

names = %( Porter SmithJimmy JonesRonald Jackson).split('\n')

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

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