0

我需要从数组中动态检索大小为 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

4 回答 4

2

这是您可以执行此操作的一种紧凑方法。它依赖于索引超出数组返回的事实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]
于 2013-02-27T19:12:37.553 回答
0

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

于 2013-02-27T19:12:51.093 回答
0

Enumerable#each_cons会成功的:

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

输出:

["a", "b", "c"]
["b", "c", "d"]
["c", "d", "e"]
于 2013-02-27T20:03:33.143 回答
0

这就是我做到的(不得不绕过红宝石索引负值):

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"]

It wont work if a negative index is passed though.

于 2013-02-27T23:58:21.930 回答