a = [ "a", "b", "c", "d" ]
a.rotate #=> ["b", "c", "d", "a"]
#rotate
是Ruby 1.9中的Array
方法。我想在Ruby 1.8.7中使用此功能。什么是理想的代码?
答案 0 :(得分:11)
如果您require 'backports/1.9.2/array/rotate'
,您将在旧版本的Ruby中获得Array#rotate
和rotate!
。
无论哪种方式,你都要避免重新发明轮子,更重要的是你获得了通过RubySpec的实现的优势。它适用于所有极端情况,并确保与Ruby 1.9兼容。
例如,两个答案中没有一个适用于[]
!
答案 1 :(得分:9)
您可以使用a.push(a.shift)
实现相同目标。它基本上删除了第一个元素(shift)并将其追加到末尾(推送)。
答案 2 :(得分:2)
没有什么能比晚会迟到......;)
与a.rotate!(n)
类似:
a += a.shift(n)
它适用于a = []
。但是,与a.rotate!(n)
不同,如果n
大于a
的长度,它就不会执行任何操作。
以下内容保留a
的值,并允许n
大于a.length
,但代价是更加复杂:
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
答案 3 :(得分:1)
旋转!没有参数的版本,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