根据整数值创建n个项目的数组

Mar*_*tin 61 ruby

鉴于我有一个整数值,例如10.

如何创建一个包含10个元素的数组[1,2,3,4,5,6,7,8,9,10]

Mic*_*ohl 127

你可以只是扩大范围:

[*1..10]
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

Ruby 1.9允许多个splats,这非常方便:

[*1..3, *?a..?c]
#=> [1, 2, 3, "a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

  • 这很好,因为我之前没有意识到:[*0..0]#=> [0]但是,[*1..0]#=> [] (2认同)
  • 它们是字符文字.`?c =='c'#=> true` (2认同)
  • 我知道您是在7年前写的,但这很酷。谢谢! (2认同)

小智 22

又一个棘手的方法:

> Array.new(10) {|i| i+1 }
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)

  • 如果你把它写成`Array.new(10,&:next)`,那就更难了. (10认同)
  • 甚至更棘手:`Array.new(10,&1.method(:+))` (10认同)

Dar*_*tle 7

def array_up_to(i)
    (1..i).to_a
end
Run Code Online (Sandbox Code Playgroud)

这允许您:

 > array_up_to(10)
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)


Ale*_*kin 7

关于使用棘手方法的评论:

require 'benchmark'

Benchmark.bm { |x|
  x.report('[*..] ') do
    [*1000000 .. 9999999]
  end  

  x.report('(..).to_a') do
    (1000000 .. 9999999).to_a
  end

  x.report('Array(..)') do
    Array(1000000 .. 9999999)
  end

  x.report('Array.new(n, &:next)') do
    Array.new(8999999, &:next)
  end

}
Run Code Online (Sandbox Code Playgroud)

要小心,这个棘手的方法Array.new(n, &:next)比较慢,而其他三种基本方法是相同的.

                           user     system      total        real
[*..]                  0.734000   0.110000   0.844000 (  0.843753)
(..).to_a              0.703000   0.062000   0.765000 (  0.843752)
Array(..)              0.750000   0.016000   0.766000 (  0.859374)
Array.new(n, &:next)   1.250000   0.000000   1.250000 (  1.250002)
Run Code Online (Sandbox Code Playgroud)