我想创建一个固定大小的数组,其中已经从另一个数组填充了默认数量的元素,所以假设我有这个方法:
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中有更简单的方法吗?就像扩展我已经使用nil对象的数组的当前大小一样?
答案 0 :(得分:27)
def fixed_array(size, other)
Array.new(size) { |i| other[i] }
end
fixed_array(5, [1, 2, 3])
# => [1, 2, 3, nil, nil]
答案 1 :(得分:10)
5.times.collect{|i| other[i]}
=> [1, 2, 3, nil, nil]
答案 2 :(得分:5)
在ruby中有更简单的方法吗?就像扩展我已经使用nil对象的数组的当前大小一样?
是的,您可以通过Array#[]=
设置最后一个元素来扩展当前数组:
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
请注意,这将修改传递的数组。
答案 3 :(得分:3)
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]
答案 4 :(得分:1)
您还可以执行以下操作:
(假设other = [1,2,3]
)
(other+[nil]*5).first(5)
=> [1, 2, 3, nil, nil]
如果其他是[],你得到
(other+[nil]*5).first(5)
=> [nil, nil, nil, nil]
答案 5 :(得分:1)
与@xaxxon的答案相似,但更短:
5.times.map {|x| other[x]}
或
(0..4).map {|x| other[x]}
答案 6 :(得分:0)
此答案使用fill
方法
def fixed_array(size, other, default_element=nil)
_other = other
_other.fill(default_element, other.size..size-1)
end