Array#slice(index,length)在index + length超出范围时获取数组开头的元素

时间:2014-07-03 22:39:08

标签: ruby

我正在寻找一种紧凑且可读的方法来切割具有索引和长度的数组,但是当索引+长度超出范围时,而不是像数组

[ "a", "b", "c", "d", "e" ].slice(4, 3) #=> ["e"]

我想在数组的开头获取元素:

#=> ["e", "a", "b"]

5 个答案:

答案 0 :(得分:3)

你可以这样做:

index = 4
length = 3
[ "a", "b", "c", "d", "e" ].cycle.take(index + length).last(length)

答案 1 :(得分:1)

a = [ "a", "b", "c", "d", "e" ]
Array.new(3) { |i| a[(i+4)%a.size] }
# => ["e", "a", "b"]

这处理环绕:

Array.new(10) { |i| a[(i+4)%a.size] }
# => ["e", "a", "b", "c", "d", "e", "a", "b", "c", "d"]

答案 2 :(得分:1)

使用Enumerator::Lazy,您可以执行以下操作。 由于Enumerable#drop返回一个数组,你必须使用惰性枚举器来处理无限数组。如果要获取多次包装的数组,可以使用此方法

适用于ruby 2.1.2。

["a","b","c","d","e"].lazy.cycle.drop(4).take(3).to_a # ["e","a","b"]

["a","b","c","d","e"].lazy.cycle.drop(4).take(6).to_a # ["e","a","b","c","d","e"]

答案 3 :(得分:0)

这是一种简单的方法:

[ "a", "b", "c", "d", "e" ].rotate(4).slice(0, 3) #=> ["e", "a", "b"]

答案 4 :(得分:0)

就像使用旋转的另一个答案(我使用符号来澄清我的答案):

(:a..:e).to_a.rotate(4).first(3) #=> [:e, :a, :b]