25

我想创建一个固定大小的数组,其中已经从另一个数组填充了默认数量的元素,所以可以说我有这个方法:

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]

在红宝石中有更简单的方法吗?就像用 nil 对象扩展我已经拥有的数组的当前大小一样?

4

8 回答 8

44
def fixed_array(size, other)  
   Array.new(size) { |i| other[i] }
end
fixed_array(5, [1, 2, 3])
# => [1, 2, 3, nil, nil]
于 2013-05-30T08:10:59.680 回答
12
5.times.collect{|i| other[i]}
 => [1, 2, 3, nil, nil] 
于 2013-05-30T08:28:59.767 回答
5

在红宝石中有更简单的方法吗?就像用 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

请注意,这将修改传递的数组。

于 2013-05-30T09:04:10.897 回答
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]
于 2013-05-30T08:19:51.000 回答
2

您还可以执行以下操作:(假设other = [1,2,3]

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

如果其他是[],你会得到

(other+[nil]*5).first(5)
=> [nil, nil, nil, nil]
于 2016-04-06T15:51:32.923 回答
2

类似于@xaxxon 的答案,但更短:

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

或者

(0..4).map {|x| other[x]}
于 2016-04-06T15:57:14.717 回答
1

这个答案使用fill方法

def fixed_array(size, other, default_element=nil)
  _other = other
  _other.fill(default_element, other.size..size-1)
end
于 2017-02-24T01:30:33.997 回答
0

这个怎么样?所以你不要创建一个新数组。

def fixed_array(size, other)
  (size - other.size).times { other << nil }
end
于 2022-01-25T17:13:02.563 回答