【问题标题】:What does %w(array) mean?%w(array) 是什么意思?
【发布时间】:2010-11-19 11:14:10
【问题描述】:

我正在查看 FileUtils 的文档。

我对以下行感到困惑:

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

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

【问题讨论】:

标签: ruby arrays string notation


【解决方案1】:

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

Here are all % literals:

  • %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"]

【讨论】:

  • 从 Ruby 2.0.0 开始,您还可以使用 %i() 生成符号数组。
  • 还有%()(或%[]%{})提供双引号字符串并转义双引号,如%Q()。例如。 %("sender name" <sender@example.com>) # => "\"sender name\" <sender@example.com>"
  • @ChristopherOezbek %i[nterned] 怎么样?由于符号是内部字符串。
【解决方案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"] 的数组

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 此外,括号几乎可以是任何其他字符,例如方括号 %w[...]、花括号 %w{...} 甚至感叹号 %w!.. .!.所有这些都有相同的行为(返回一个数组)。
    • 最简单的记忆方法是“空格(w)分隔数组”。
    • 在此处查看“常规分隔输入”ruby-doc.org/docs/ProgrammingRuby/html/language.html
    • 如果字符串有空格,用\转义即可。例如:%w(ab\ c def) # => ["ab c", "def"]
    • 猜猜这个页面也能解决问题:ruby-doc.org/core-2.0/doc/syntax/…
    【解决方案4】:

    我们应该使用%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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 天哪,谢谢!我开始认为它不存在。别人提供的rubydoc链接坏了。
      • 文档不是为这些没有包含在 RubyDocs 中很长一段时间。
      【解决方案6】:

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

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

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

      使用的分隔符可以是任何字符,而不仅仅是左括号。试玩上面的例子,看看效果如何。

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-04
          • 2019-11-17
          • 1970-01-01
          • 1970-01-01
          • 2015-01-05
          • 2015-03-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多