2011-10-25 10 views
5

Sto rifattorizzando un programma di pedine e sto tentando di elaborare una richiesta di spostamento dei giocatori (nella forma di "3, 3, 5, 5" per esempio) in un int array. Ho il seguente metodo, ma non si sente come Ruby-come come so che potrebbe essere:Rubrica di refactoring: conversione dell'array di stringhe nell'array 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 

Ho il seguente test RSpec con esso.

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 

Il test passa, ma penso che il codice sia piuttosto brutto. Qualsiasi aiuto sarebbe apprezzato. Grazie.

Steve

risposta

22

si potrebbe sostituire l'iterazione esplicita di each da un'operazione mappa:

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

Un modo più conciso di scrivere questo come proposto da @tokland è:

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

Evita di scrivere in modo esplicito un blocco e anche di scegliere un nome di variabile come x che non è rilevante come dovrebbe fare qualsiasi nome.

Si prega di dare un'occhiata al posto StackOverflow What does to_proc method mean?

+8

move_request.split ("") del programma. (&: To_i) – tokland

+0

+1: Non lo sapevo. Una interessante spiegazione è contenuta nel libro "Programming Ruby 1.9" di [Pragmatic Bookshelf] (http://pragprog.com/) nella sezione "The Symbol.to_proc Trick" a pagina 363 (4a stampa, maggio 2011). – lkuty