2011-10-25 39 views
5

Bir dama programını yeniden düzenliyorum ve bir oyuncu taşıma isteğini (örneğin "3, 3, 5, 5" biçiminde) bir int olarak işlemeye çalışıyorum dizi. Aşağıdaki yöntemi var ama olması gerektiği bildiği gibi bu Ruby benzeri olarak hissetmez:Refactoring Ruby: Dize dizisini int dizisine dönüştürme

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 

onunla aşağıdaki RSpec test var.

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 

Test geçiyor, ancak kodun oldukça çirkin olduğunu düşünüyorum. Herhangi bir yardım takdir edilecektir. Teşekkürler.

Steve

cevap

22

Bir harita ameliyatla each açık iterasyon yerini alabilir:

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

@tokland tarafından önerilen bu yazı daha özlü bir yoldur:

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

Bir bloğun açık bir şekilde yazılmasını ve herhangi bir ismin yapacağı ilgili olmayan x gibi bir değişken isminin seçilmesini önler.

What does to_proc method mean?

+8

move_request.split stackoverflow sonrası bir göz Lütfen ("") haritası. (&: To_i) – tokland

+0

1: Ben bilmiyordum. Kitapçığın "The Book.to_proc Trick" bölümündeki "Pragmatik Kitaplık" bölümünden (http://pragprog.com/) "Programlama Ruby 1.9" kitabında ilginç bir açıklaması var (sayfa 4, 4, baskı, Mayıs 2011). – lkuty

İlgili konular