2011-10-25 22 views
5

私はチェッカープログラムをリファクタリングしていますが、プレーヤーの移動要求を(例えば "3、3、5、5"のような形で)intに処理しようとしていますアレイ。私は、次のような方法がありますが、私はそれができる知っているとして、それは、Ruby-など感じない:リファクタリングRuby:文字配列を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 

私はそれで、次のRSpecのテストを持っています。

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 

テストに合格しますが、コードはかなり醜いと思います。どんな助けもありがとう。ありがとう。

スティーブ

答えて

22

あなたは、マップ操作によってeachの明示的な繰り返しを置き換えることができます:@toklandによって提案されたとして、これを書くの

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

より簡潔な方法は次のとおりです。

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

ブロックを明示的に書くことを避け、任意の名前とは関係のないxのような変数名も選択します。

StackOverflowのポストでWhat does to_proc method mean?

+8

move_request.split( "")マップ(&:to_i)を見てください。 – tokland

+0

+1を:私はそれを知りませんでした。 「Pragmatic Bookshelf」(http://pragprog.com/)の「Programming Ruby 1.9」の「Symbol.to_procトリック」のセクション(第4刷、2011年5月)の興味深い説明があります。 – lkuty

関連する問題