Стварэнне масіва з фіксаваным памерам, і заліваюць змесціва па змаўчанні з дапамогай іншага масіва?

Я хачу, каб стварыць масіў фіксаванага памеру з нумарам па змаўчанні элементаў ужо запоўненымі з іншага масіва, так што дазваляе сказаць, што ў мяне ёсць гэты метад:

def fixed_array(size, other)
  array = Array.new(size)
  other.each_with_index { |x, i| array[i] = x }
  array
end

Такім чынам, я магу выкарыстоўваць метад, як:

fixed_array(5, [1, 2, 3])

І атрымаеце

[1, 2, 3, nil, nil]

Ці ёсць больш просты спосаб зрабіць гэта ў Ruby? Як пашырыць бягучы памер масіва ў мяне ўжо ёсць з нулявымі аб'ектамі?

10
Ці хочаце вы новы масіў, або пашырыць існуючы масіў? Што?
дададзена аўтар sawa, крыніца

7 адказы

def fixed_array(size, other)  
   Array.new(size) { |i| other[i] }
end
fixed_array(5, [1, 2, 3])
# => [1, 2, 3, nil, nil]
24
дададзена
Ніца, я буду выкарыстоўваць свой код, тнх :)
дададзена аўтар rorra, крыніца
5.times.collect{|i| other[i]}
 => [1, 2, 3, nil, nil] 
10
дададзена
<�Р> Ці ёсць больш просты спосаб зрабіць гэта ў Ruby? Як пашырыць бягучы памер масіва У мяне ўжо ёсць з нулявымі аб'ектамі?

Так, вы можаце пашырыць свой бягучы масіў, усталяваўшы апошні элемент праз Масіў # [] = :

a = [1, 2, 3]
a[4] = nil # index is zero based
a
# => [1, 2, 3, nil, nil]

Метад можа выглядаць наступным чынам:

def grow(ary, size)
  ary[size-1] = nil if ary.size < size
  ary
end

Звярніце ўвагу, што гэта зменіць прыняты масіў.

5
дададзена
a = [1, 2, 3]
b = a.dup
Array.new(5){b.shift} # => [1, 2, 3, nil, nil]

або

a = [1, 2, 3]
b = Array.new(5)
b[0...a.length] = a
b # => [1, 2, 3, nil, nil]

або

Array.new(5).zip([1, 2, 3]).map(&:last) # => [1, 2, 3, nil, nil]

або

Array.new(5).zip([1, 2, 3]).transpose.last # => [1, 2, 3, nil, nil]
3
дададзена

Вы таксама можаце зрабіць наступнае: (Пры ўмове, іншае = [1,2,3] )

(other+[nil]*5).first(5)
=> [1, 2, 3, nil, nil]

калі іншае [], вы атрымаеце

(other+[nil]*5).first(5)
=> [nil, nil, nil, nil]
1
дададзена

Падобны адказ па @xaxxon, але яшчэ карацей:

5.times.map {|x| other[x]}

або

(0..4).map {|x| other[x]}
1
дададзена

гэты адказ выкарыстоўвае запоўніць метад

def fixed_array(size, other, default_element=nil)
  _other = other
  _other.fill(default_element, other.size..size-1)
end
0
дададзена