我需要从数组中动态检索大小为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
。
答案 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"]
如果通过负面索引,它将无法工作。