2012-08-02 8 views
5

Tengo una matriz. Necesito mantener todo excepto el elemento en el índice 0. Mi cerebro está frito en este punto. He estado programando todo el día. Cualquier ayuda sería increíble. ¡Gracias!Ruby Quitar el primer índice de una matriz

+2

http://whathaveyoutried.com? –

Respuesta

14

Utilice el método Array#shift, que hace exactamente lo que quiere :

a = [1, 2, 3] 
a.shift # => 1 
a # => [2, 3] 
+0

Podría haber jurado que intenté esto ya. Parecía tan fácil. Debo haber tenido un error tipográfico o algo así. Gracias –

+4

Para una mnemónica divertida (vulgar) que lo ayude a recordar si 'shift' o' unshift' quita elementos de la matriz, intente soltar la "f" del nombre. :) – Phrogz

+0

@Phrogz: lol, me encanta. – maerics

7

Se podía utilizar índice de matriz rebanar:

some_array[1..-1] 

o, si desea modificar de forma permanente una variable, howsabout:

some_array = [1,2,3,4] 
some_array.delete_at(0) 
# => 1 
some_array 
# => [2,3,4] 
1

Dependiendo de cómo lo que se hará con el resultado (una matriz con el primer elemento eliminado) hay diferentes maneras de conseguir el resultado y cómo va a ser utilizado puede afecta la elección.

Una forma cambia la matriz original a una nueva matriz con el primer elemento eliminado mediante la aplicación de un método, ignorando el resultado de ese método y logrando el resultado deseado debido al efecto secundario del método aplicado. El PO aceptó una respuesta que hizo esto (lo que implica que funcionó en su caso):

a = [ "a", "b", "c" ] 
a.shift #=> "a" 
a #=> ["b", "c"] 

que funciona bien si desea que preservaron la matriz resultante, pero su necesidad es dejar caer algún método en el medio de una cadena de de los métodos existentes para "deshacerse de ese primer elemento de matriz". Pero, en mi caso, tenía una matriz donde el primer elemento era una línea de encabezado producida por un comando del sistema seguido de varias líneas de la salida de ese comando, una en cada elemento de la matriz y modificaba las líneas para lograr el resultado deseado cuando se dio cuenta de que la línea de encabezado debía eliminarse ya que, al ser una forma diferente de las líneas restantes, no se manejaba correctamente y no era necesaria. Mi línea de código original parecía algo como esto (donde, de nuevo, a es la matriz):

puts a.method1.method2.method3.method4 

y yo quería hacer esto:

puts a.method1.method2.removeFirstElement.method3.method4 

Una forma de hacer esto mediante el uso slice se mostró en una respuesta diferente a pesar de que no estaba claro cómo podría ser mejor en algunos casos que la respuesta aceptada:

puts a.method1.method2.slice(1..-1).method3.method4 

Si usara la respuesta aceptada lo haría ja ve a hacer algo como esto:

temp = a.method1.method2 
temp.shift 
puts temp.method3.method4 

Además de la necesidad de revisar la estructura de código original (aunque hay pros y contras para que en función de lo que se hace), es necesario crear un nuevo objeto temporal ('temp ') solo para llegar al resultado.

Es bueno saber que a donde nos dirigimos a menudo tiene un efecto definitivo sobre cómo llegar.

(Voy a señalar que casi me atrevería a preferir el uso de slice!(0) en lugar de shift para cambiar realmente la matriz desde el punto de exclamación deja claro que se va a cambiar la matriz; el método shift no se ajusta a la sugerencia actual de agregar un signo de exclamación a los métodos que alterarán un objeto. Pero, ¡ay !, probablemente use shift para evitar el desorden del (0).)

Cuestiones relacionadas