我在查看FileUtils的文档。
我对下面这行内容感到困惑:
FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
“%w”是什么意思?你能给我指一下文档吗?
%w(foo bar)
是 ["foo", "bar"]
的缩写。这意味着它是一种用空格分隔字符串的数组的表示方法,而不需要在它们周围加上引号或用逗号分隔。您可以在zenspider的快速参考中找到其他字面量的写法。
%w(ab\ c def) # => ["ab c", "def"]
- Dmytro我将%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()
来生成一个符号数组。 - David Tuite%()
(或 %[]
或 %{}
)可以创建带有双引号并转义双引号的字符串,类似于 %Q()
。例如 %("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
。 - Dennis%i[nterned]
怎么样?因为符号是内部化的字符串。 - Shane Creighton-Young还有%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 – 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]
更多内容请阅读此处。
%(...)创建一个字符串,而%还可以创建其他类型的对象。与字符串类似,大写字母允许插值和转义字符,而小写字母则禁用它们。
这些是Ruby中的百分号字符串类型:
...
%w:字符串数组
我收到了一份包含用户全名的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(';')
。