2011-10-25 8 views
5

Estoy refaccionando un programa de damas, y estoy tratando de procesar una solicitud de movimiento de jugadores (en forma de "3, 3, 5, 5" por ejemplo) en una int formación. Tengo el siguiente método, pero no se siente como Ruby-como sé que podía ser:Refactoring Ruby: Conversión de matriz a matriz int

def translate_move_request_to_coordinates(move_request) 
    return_array = [] 
    coords_array = move_request.chomp.split(',') 
    coords_array.each_with_index do |i, x| 
     return_array[x] = i.to_i 
    end 
    return_array 
    end 

tengo la siguiente prueba RSpec con ella.

it "translates a move request string into an array of coordinates" do 
     player_input = "3, 3, 5, 5" 
     translated_array = @game.translate_move_request_to_coordinates(player_input) 
     translated_array.should == [3, 3, 5, 5] 
    end 

La prueba pasa, pero creo que el código es bastante feo. Cualquier ayuda sería apreciada. Gracias.

Steve

Respuesta

22

podría reemplazar la iteración explícita de each por una operación de mapa:

move_request.chomp.split(',').map { |x| x.to_i } 

Una forma más concisa de escribir esto como es propuesto por @tokland:

move_request.chomp.split(',').map(&:to_i) 

Evita escribir explícitamente un bloque y también elegir un nombre de variable como x que no es relevante como lo haría cualquier nombre.

favor, eche un vistazo en el puesto de stackoverflow What does to_proc method mean?

+8

move_request.split ("") mapa. (Y: to_i) – tokland

+0

1: Yo no lo sabía. Hay una explicación interesante de esto en el libro "Programming Ruby 1.9" de [Pragmatic Bookshelf] (http://pragprog.com/) en la sección "The Symbol.to_proc Trick" en la página 363 (4ª impresión, mayo de 2011). – lkuty

Cuestiones relacionadas