a = [ "a", "b", "c", "d" ]
a.rotate #=> ["b", "c", "d", "a"]
#rotate
是Ruby 1.9中Array
的方法。我想在Ruby 1.8.7中实现这个功能。请问最理想的代码是什么?
a = [ "a", "b", "c", "d" ]
a.rotate #=> ["b", "c", "d", "a"]
#rotate
是Ruby 1.9中Array
的方法。我想在Ruby 1.8.7中实现这个功能。请问最理想的代码是什么?
Array#rotate
和rotate!
方法,可以通过require 'backports/1.9.2/array/rotate'
来实现。[]
的情况!a.push(a.shift)
来实现相同的效果。它基本上移除了第一个元素(shift),并将其附加到末尾(push)。rotate!
的,它会修改数组,但不适用于空数组[]
。它也不太兼容1.9版本,因为它不接受旋转元素数量的参数。请参见我的答案。 - Marc-André Lafortune很抱歉来晚了... ;)
类似于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
shift
应该保持数组不变,而他们应该有一个shift!
来直接修改它。 - lurkershift
方法实际上返回被移除的元素,并且它会改变原始数组。非常有用。 - rubyprince对于没有参数的rotate!版本,gnab的很好。如果你想要一个非破坏性的版本,带有可选参数:
class Array
def rotate n = 1; self[n..-1]+self[0...n] end
end
class Array
def rotate n = 1; return self if empty?; n %= length; self[n..-1]+self[0...n] end
end
[]
。请参考我的回答。 - Marc-André Lafortunebackports
会更好。我没有修复第一个例子,因为它可能没有用处。 - sawa