我正在查看 FileUtils 的文档。
我对以下行感到困惑:
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
%w
是什么意思?你能指点我的文档吗?
%w(foo bar)
是 ["foo", "bar"]
的快捷方式。这意味着编写一个由空格而不是逗号分隔且周围没有引号的字符串数组是一种表示法。您可以在 zenspider's quickref 中找到编写文字的方法列表。
我认为 %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"]
%i()
生成符号数组。
%()
(或 %[]
或 %{}
)提供双引号字符串并转义双引号,如 %Q()
。例如%("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
%i[nterned]
怎么样?由于符号是内部字符串。
还有 %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
and %w
允许您在不使用引号和逗号的情况下创建字符串数组。
虽然这是一个旧帖子,但问题不断出现,答案对我来说并不总是很清楚,所以,这是我的想法:
%w
和 %W
是与数组相关的通用分隔输入 类型 的示例。还有其他类型,包括 %q
、%Q
、%r
、%x
和 %i
。
大写和小写版本的区别在于它让我们可以访问单引号和双引号的功能。使用单引号和(小写)%w
,我们没有代码插值(#{someCode}
)和有限范围的转义字符(\\
、\n
)。通过双引号和(大写)%W
,我们确实可以访问这些功能。
使用的分隔符可以是任何字符,而不仅仅是左括号。使用上面的示例来查看效果。
有关 %w
示例和完整列表、转义字符和分隔符的完整记录,请查看“Ruby - %w vs %W – secrets revealed!”
我们应该使用 %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。
摘自 http://ruby-doc.org/core/doc/syntax/literals_rdoc.html#label-Percent+Strings 的百分比字符串文档:
除了创建 String 的 %(...) 之外, % 还可以创建其他类型的对象。与字符串一样,大写字母允许插值和转义字符,而小写字母则禁用它们。这些是 ruby 中百分比字符串的类型: ... %w: 字符串数组
我从用户全名的 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 的原始问题,如果您希望 space
存在于最终数组输出中,如果碰巧有 space
,他们可能会写 %(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')
。
%w(ab\ c def) # => ["ab c", "def"]