数组#在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#rotate
和rotate!
在旧版本的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