从数组中获取固定大小的切片

时间:2013-02-27 19:02:41

标签: ruby arrays

我需要从数组中动态检索大小为3的切片(作为更复杂方法的一部分):

a = %w(a b c d e)
i = 0 # i is an argument, I need [nil, "a", "b"]
a[(i-1)..(i+1)]
=> [] # no luck
a[(i-1), 3]
=> ["e"]

我知道当代码搞砸了,这不是ruby的错,是我的。我错过了什么? 有没有更好的方法来实现这一目标?

我需要澄清一下。我想要的是一个给定大小的切片,围绕给定的索引,如果切片超出偏移量,则匹配到nil

4 个答案:

答案 0 :(得分:1)

这是一种紧凑的方式,你可以做到这一点。它依赖于超出数组的索引返回nil

>> i = 0; 3.times.map{|j| a[j+i]}
=> ["a", "b", "c"]
>> i = 4; 3.times.map{|j| a[j+i]}
=> ["e", nil, nil]

答案 1 :(得分:0)

each_slice您正在寻找的方法是什么?否则,请尝试为您实际想要实现的目标提供更好的示例。

答案 2 :(得分:0)

Enumerable#each_cons可以解决问题:

a.each_cons(3){|slice| p slice }

输出:

["a", "b", "c"]
["b", "c", "d"]
["c", "d", "e"]

答案 3 :(得分:0)

这就是我的方法(不得不绕过ruby索引负值):

a = %w(a b c d e)
def slice_around(ary, index)
  slice_3 = ->(x){ x == 0 ? [ary.size+1,0,1] : ((x-1)..(x+1)).to_a }
  idxs = slice_3.call(index).map { |i| ary[i] }
end

> slice_around a, 0
=> [nil, "a", "b"]
> slice_around a, 2
=> ["b", "c", "d"]

如果通过负面索引,它将无法工作。