数组#在ruby 1.8.7中等效旋转

a = [ "a", "b", "c", "d" ] a.rotate #=> ["b", "c", "d", "a"] 

#rotate是Ruby 1.9中Array一种方法。 我想在Ruby 1.8.7中使用此function。 什么是理想的代码?

如果你require 'backports/1.9.2/array/rotate' ,你将获得Array#rotaterotate! 在旧版本的Ruby中。

无论哪种方式,您都避免重新发明轮子,更重要的是,您获得了通过RubySpec的实现的优势。 它适用于所有极端情况并确保与Ruby 1.9的兼容性。

例如,给出[]的两个答案都不起作用!

您可以使用a.push(a.shift)实现相同的a.push(a.shift) 。 它基本上删除了第一个元素(shift)并将其追加到末尾(push)。

什么都不喜欢晚到晚会…;)

a.rotate!(n)类似a.rotate!(n)

 a += a.shift(n) 

它适用于a = [] 。 但是,与a.rotate!(n) ,如果n大于a的长度,则它不会做任何事情。

以下内容保留了a的值并允许大于a.length n工作,但代价是更复杂:

 a.last(a.length - (n % a.length)) + a.first(n % a.length) 

如果单独计算一次n % a.length并且将一个包裹在方法猴子中的整个东西打包到Array这显然是最好的。

 class Array def rot(n) m = n % self.length self.last(self.length - m) + self.first(m) end end 

对于旋转! 没有参数的版本,gnab是好的。 如果你想要非破坏性的,可选参数:

 class Array def rotate n = 1; self[n..-1]+self[0...n] end end 

如果n可能变得大于数组的长度:

 class Array def rotate n = 1; return self if empty?; n %= length; self[n..-1]+self[0...n] end end