Array # rotar equivalente en ruby ​​1.8.7

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

#rotate es un método de Array en Ruby 1.9. Quiero esta funcionalidad en Ruby 1.8.7. ¿Cuál es el código ideal?

Si require 'backports/1.9.2/array/rotate' , obtendrá Array#rotate and rotate! en versiones anteriores de ruby.

De cualquier forma, evita reinventar la rueda y, lo que es más importante, obtiene la ventaja de una implementación que pasa RubySpec. Funcionará para todos los casos de esquina y garantizará la compatibilidad con Ruby 1.9.

Por ejemplo, ninguna de las dos respuestas dadas funciona para [] !

Puedes lograr lo mismo con a.push(a.shift) . Básicamente elimina el primer elemento (shift) y lo agrega al final (push).

Nada como llegar tarde a la fiesta …;)

Similar a a.rotate!(n) :

 a += a.shift(n) 

Y funciona con a = [] . Sin embargo, a diferencia de a.rotate!(n) , no hace nada si n es mayor que la longitud de a .

Lo siguiente preserva el valor de a y permite que n mayor que a.length funcione, a costa de ser un poco más elaborado:

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

Obviamente, esto sería mejor si n % a.length se calcula una vez por separado y todo esto se envuelve en un método mono parcheado en Array .

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

Para el giro! Versión sin el parámetro, gnab es bueno. Si quieres el no destructivo, con un parámetro opcional:

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

Si n puede llegar a ser más grande que la longitud de la matriz:

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