【问题标题】:How to initialize an array in one step using Ruby?如何使用 Ruby 一步初始化数组?
【发布时间】:2011-06-21 23:01:54
【问题描述】:

我这样初始化一个数组:

array = Array.new
array << '1' << '2' << '3'

是否可以一步完成?如果有,怎么做?

【问题讨论】:

  • +1 只为新颖的单行重复推送。 :)
  • @Phrogz 略短:array = Array.new &lt;&lt; 1 &lt;&lt; 2 &lt;&lt; 3 ;)
  • @AlexanderSuraphel 创建一个 Fixnums 数组而不是字符串数组。
  • @Phrogz 我只想提一下,它甚至可以更短。您只需将1 更改为'1'

标签: ruby arrays initialization


【解决方案1】:

你可以使用数组字面量:

array = [ '1', '2', '3' ]

你也可以使用范围:

array = ('1'..'3').to_a  # parentheses are required
# or
array = *('1'..'3')      # parentheses not required, but included for clarity

对于以空格分隔的字符串数组,您可以使用Percent String syntax

array = %w[ 1 2 3 ]

您还可以将块传递给Array.new 以确定每个条目的值:

array = Array.new(3) { |i| (i+1).to_s }

最后,虽然它不会产生与上述其他答案相同的三个字符串数组,但请注意,您可以在 Ruby 1.8.7+ 中使用枚举器来创建数组;例如:

array = 1.step(17,3).to_a
#=> [1, 4, 7, 10, 13, 16]

【讨论】:

  • 加一个以获得详细答案,尽管我更喜欢 splat 而不是 to_a ([*'1'..'3'])。
  • @MichaelKohl 我同意;我的(错误的)印象是您无法在 1.8.6 中使用范围。我补充一下,谢谢!请注意,您不需要在数组文字中进行 splat(除非您与 splat 一起合成)。
  • 我知道,只是我主要使用 splat 来达到这个目的(即合成),而且我也喜欢它展示你最终的结果。
  • 另外,可以使用类方法Array::[]:Array[ "1","2","3"] #=&gt; ["1","2","3"](我不认为这个方法和数组字面量构造函数有任何关系)。您还可以使用顶级 Kernel#Array(方法名确实像类名)Array(1..5) #=&gt; [1,2,3,4,5]
  • * 有什么作用?在哪里可以找到相关文档?
【解决方案2】:

你可以的

array = ['1', '2', '3']

正如其他人所指出的,您还可以使用 %w 符号初始化数组,如下所示:

array = %w(1 2 3)

array = %w[1 2 3]

请注意,在这两种情况下,每个元素都是字符串,而不是整数。 所以如果你想要一个元素是整数的数组,你不应该用撇号包装每个元素:

array_of_integers = [1, 2, 3]

此外,您不需要在元素之间放置逗号(在创建没有此 %w 表示法的数组时这是必需的)。如果你这样做(我经常犯错),如:

wrong_array = %w(1, 2, 3)

它的元素将是三个字符串——“1”、“2”、“3”。所以如果你这样做:

puts wrong_array

输出将是:

1,
2,
3
=>nil

这不是我们想要的。

希望这有助于澄清这一点!

【讨论】:

    【解决方案3】:

    您可以在 ruby​​ 数组中使用 %w 符号简单地做到这一点。

    array = %w(1 2 3)
    

    它将数组值 1,2,3 添加到数组中并打印输出为["1", "2", "3"]

    【讨论】:

      【解决方案4】:

      Oneliner:

      array = [] << 1 << 2 << 3   #this is for fixnums.
      

       a = %w| 1 2 3 4 5 |
      

       a = [*'1'..'3']
      

       a = Array.new(3, '1')
      

       a = Array[*'1'..'3']
      

      【讨论】:

      • 我没有投反对票,但我猜是因为这调用了三个方法并增量增长了数组,而不是 [1,2,3] 进行单个初始化。另外,你的角色更多。此外,您创建了一个 Fixnums 数组,而 OP 正在询问一个字符串数组。
      【解决方案5】:

      证明有不止一个六种方法来做到这一点:

      plus_1 = 1.method(:+)
      Array.new(3, &plus_1) # => [1, 2, 3]
      

      如果 1.method(:+) 不可行,你也可以这样做

      plus_1 = Proc.new {|n| n + 1}
      Array.new(3, &plus_1) # => [1, 2, 3]
      

      当然,在这种情况下这有点过头了,但如果 plus_1 是一个非常长的表达式,您可能希望将它放在与数组创建不同的行上。

      【讨论】:

        【解决方案6】:

        除了以上答案,你也可以这样做

            =>  [*'1'.."5"]   #remember *
            => ["1", "2", "3", "4", "5"]
        

        【讨论】:

        • 在 1.9 中你也可以这样做:&gt;&gt; [*?1..?5] #=&gt; ["1", "2", "3", "4", "5"].
        【解决方案7】:

        如果你有一个字符串数组,你也可以这样初始化它:

        array = %w{1 2 3}

        只需用空格分隔每个元素

        【讨论】:

          【解决方案8】:

          您可以通过在[] 中写入元素来一步初始化数组,如下所示:

          array = ['1', '2', '3']
          

          【讨论】:

            【解决方案9】:

            要创建这样一个数组,您可以这样做:

            array = ['1', '2', '3']
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-09-17
              • 2014-10-13
              • 1970-01-01
              • 2020-07-19
              • 2021-07-21
              • 1970-01-01
              • 1970-01-01
              • 2012-06-23
              相关资源
              最近更新 更多