Вопрос по ruby – Создать массив из n элементов на основе целочисленного значения

52

Учитывая, что у меня есть целочисленное значение, например,10.

Как я могу создать массив из 10 элементов, таких как[1,2,3,4,5,6,7,8,9,10]?

Возможный дубликатCorrect way to populate an Array with a Range in Ruby David Moles

Ваш Ответ

5   ответов
16

еще один хитрый способ:

> Array.new(10) {|i| i+1 }
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Еще сложнее, если вы напишите это какArray.new(10, &:next).
Еще сложнее:Array.new(10, &1.method(:+))
115

Вы можете просто разделить диапазон:

[*1..10]
#=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Ruby 1.9 допускает несколько сплатов, что довольно удобно:

[*1..3, *?a..?c]
#=> [1, 2, 3, "a", "b", "c"]
Они символические литералы.?c == 'c' #=> true
+1 для нескольких знаков
@MichaelKohl выглядит довольно странно, я думаю, что я предпочел бы использовать одинарные кавычки для ясности, как в[*1..3, *'a'..'z'] но это здорово для игры в код, и я также не знал, что?a == 'a' (может, мне больше не хватает?), недурно: D
Это здорово, потому что я до этого не понимал: [* 0..0] # = & gt; [0] Но, [* 1..0] # = & gt; []
@MichaelKohl - спасибо - что означает знак вопроса? прежде чем буквы выше означают?
7
def array_up_to(i)
    (1..i).to_a
end

Что позволяет вам:

 > array_up_to(10)
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
6

О комментариях хитрыми методами:

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

}

Будьте осторожны, этот хитрый метод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)
1

Вы можете сделать это:

array= Array(0..10)

Если вы хотите ввести, вы можете использовать это:

puts "Input:"
n=gets.to_i
array= Array(0..n)
puts array.inspect

Похожие вопросы