我正在寻找一种紧凑且可读的方法来切割具有索引和长度的数组,但是当索引+长度超出范围时,而不是像数组
[ "a", "b", "c", "d", "e" ].slice(4, 3) #=> ["e"]
我想在数组的开头获取元素:
#=> ["e", "a", "b"]
答案 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]