数组#在ruby 1.8.7中等效旋转

时间:2011-03-11 07:21:06

标签: ruby

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

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

4 个答案:

答案 0 :(得分:11)

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

无论哪种方式,你都要避免重新发明轮子,更重要的是你获得了通过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