我正在查看fileutils的文档。我对下面这句话感到困惑:
1
| FileUtils.cp %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6' |
%w是什么意思?你能给我指一下文件吗?
%w(foo bar)是["foo","bar"]的快捷方式。这意味着它是一种表示法,写一个字符串数组,由空格而不是逗号分隔,并且周围没有引号。您可以在Zenspiper的QuickRef中找到一个书写文字的方法列表。
- 此外,括号几乎可以是任何其他字符,如方括号%w[…]、大括号%w…甚至是感叹号%w!……!。所有这些都具有相同的行为(返回数组)。
- 记忆最简单的方法就是"空格(w)分隔数组"。
- 请参阅ruby-doc.org/docs/programmingruby/html/language.html中的"常规分隔输入"。
- 是否可以向数组中添加空字符串?结果应为E.Q.['abc'、''、'def']。
- 如果字符串中有空格,只需使用对其进行转义即可。例:%w(ab\ c def) # => ["ab c","def"]。
- Perl:qw/Interpolated word list without quotes/。
- 我猜这个页面也解决了这个问题:ruby doc.org/core-2.0/doc/syntax/…
- @dmitry,如果您想使用%w(..)语法,那么您应该认真考虑。如果字符串包含空格,则转义它们会使代码的可读性降低很多。我建议在勾号内使用一个规则的字符串数组(['...', '.. ..'])。
- 顺便说一下,由于Ruby2.0,还有用于创建符号数组的%i(...)操作符:%i(a b cd) # => [:a, :b, :cd]。
- 当正常语法正常工作时,Ruby为什么有这种编写字符串数组的替代方法?有人知道设计思想是什么吗?似乎是多余的,只是在阅读别人的代码时产生混乱的机会。
- @列维尼娜:可读性和简洁性。否则,您也可以问"当您可以在组装中完成所有工作时,为什么要生成Ruby?"
- @levinja是因为%w(....)符号的输入容易得多。比较x = ["the","quick","brown","fox"]和x = %w( the quick brown fox),尤其是在剪切和粘贴时。
- 为什么是w?请有人告诉我在Ruby中这个选择背后的理由是什么。
- @Yurighensev"W"代表"单词"。
- @sepp2k如果等同于"a b c".split,则是合理的。
- 有没有一种方法可以将它用于动态值,比如变量?如%w( self.id, self.name )。它假设它们是字符串,所以我得到了[ 'self.id', 'self.name' ]。
- 有史以来最糟糕的Ruby语法,%w(there_are fewer_than_you would_think)中有多少项?牺牲可读性是技术债务的本质。
我认为%w()是一个"单词数组"——元素由空格分隔,它返回一个字符串数组。
还有其他%文字:
- %r()是编写正则表达式的另一种方法。
- %q()是编写单引号字符串的另一种方法(可以是多行,这很有用)
- %q()给出双引号字符串
- %x()是一个shell命令
- %i()给出了一个符号数组(ruby>=2.0.0)
- %s()把foo变成一个符号(:foo)
我不认识其他人,但可能有人潜伏在那里…
- 从Ruby2.0.0开始,您还可以使用%i()生成一个符号数组。
- 还有%()(或%[]或%{}),它提供双引号字符串,并避开双引号,如%Q()。如%("sender name" ) # =>""sender name" "。
还有%s允许您创建任何符号,例如:
1 2 3
| %s|some words| #Same as :'some words'
%s[other words] #Same as :'other words'
%s_last example_ #Same as :'last example' |
自从Ruby2.0.0以来,您还拥有:
1 2 3 4
| %i( a b c ) # => [ :a, :b, :c ]
%i[ a b c ] # => [ :a, :b, :c ]
%i_ a b c _ # => [ :a, :b, :c ]
# etc... |
%W和%W允许您不使用引号和逗号创建字符串数组。
- 有关%w和%w之间的区别,请参阅stackoverflow.com/questions/690794/ruby-array-w-vs-w
虽然这是一篇老文章,但问题不断出现,我觉得答案并不总是很清楚,所以,我的想法是:
%W和%W是与数组相关的一般定界输入类型的示例。还有其他类型,包括%q、%q、%r、%x和%i。
大小写版本的区别在于,它允许我们访问单引号和双引号的功能。对于单引号和(小写)%W,我们没有代码插值(#{someCode})和有限范围的转义字符(\\,
)。使用双引号和(大写)%W我们确实可以访问这些功能。
使用的分隔符可以是任何字符,而不仅仅是左括号。用上面的例子来看看效果。
要获得包含%W和完整列表、转义字符和分隔符示例的完整报告,请查看"ruby-%w vs%w–秘密泄露!"
我们应该用%w[]代替%w()。
根据Ruby样式指南:
当需要单词数组(不带空格和特殊字符的非空字符串)时,首选%w。仅将此规则应用于具有两个或多个元素的数组。
1 2 3 4 5
| # bad
STATES = ['draft', 'open', 'closed']
# good
STATES = %w[draft open closed] |
使用最适合各种百分比文本的大括号。
用于数组文字(%w, %i, %W, %I)的[],因为它与标准数组文字对齐。
1 2 3 4 5 6 7
| # bad
%w(one two three)
%i(one two three)
# good
%w[one two three]
%i[one two three] |
欲了解更多信息,请阅读此处。
摘自http://ruby doc.org/core/doc/syntax/literals_rdoc.html label percent+strings:
Besides %(...) which creates a String, the % may create other types of object. As with strings, an uppercase letter allows interpolation and escaped characters while a lowercase letter disables them.
These are the types of percent strings in ruby:
...
%w: Array of Strings
- 谢谢!我开始觉得它不存在了。其他人提供的rubyDoc链接已断开。
- 这些文件不是为了这些,很长一段时间没有包含在RubyDocs中。
我从csv电子表格中得到了一组列,其中包含了完整的用户名,我需要保留格式和空格。我在使用Ruby时找到的最简单的方法是:
1 2 3 4
| names = %( Porter Smith
Jimmy Jones
Ronald Jackson).split('
') |
这突显了%()创建了一个类似于"Porter Smith
JimmyJones
Ronald Jackson"的字符串,为了得到数组split,该字符串位于"
"["Porter Smith","Jimmy Jones","Ronald Jackson"]上。
因此,为了回答OP最初的问题,如果您希望space存在于最终数组输出中时,恰好有space,那么他们也可以编写%(cgi\ spaeinfilename.rb;complex.rb;date.rb).split(';')。