2

じゃんけんゲームです。irb から、game.class はそれが配列だと言っています。ゲームに勝った人の名前を見つけたいと思っています (この場合は Player2)。

game = [["Player1", "P"], ["Player2", "S"]]

頭に浮かぶアプローチは、名前の値を分割して Hash を返すことです。次に、値を介してそのハッシュを検索して、プレイヤー名を取得します。

h = Hash.new(0)
game.collect do |f|
  h[f] = f[1]
end
h
#=> {["Player1", "P"]=>"P", ["Player2", "S"]=>"S"}

これは近いですが、葉巻ではありません。私が欲しい

{"Player1" => "P", "Player2" => "S"}

私は注入方法で再試行しました:

game.flatten.inject({}) do |player, tactic| 
  player[tactic] = tactic  
  player 
end
#=> {"Player1"=>"Player1", "P"=>"P", "Player2"=>"Player2", "S"=>"S"}

これはうまくいきませんでした:

Hash[game.map {|i| [i(0), i(1)] }]
#=> NoMethodError: undefined method `i' for main:Object

理解に役立つ何かへのポインタをいただければ幸いです。

4

4 に答える 4

3

これも簡単にできます。

game = [["Player1", "P"], ["Player2", "S"]]
#=> [["Player1", "P"], ["Player2", "S"]]
Hash[game]
#=> {"Player1"=>"P", "Player2"=>"S"}
于 2012-10-20T10:36:21.987 に答える
2

使用する:

game.inject({}){ |h, k| h[k[0]] = k[1]; h }
于 2012-10-20T10:31:45.027 に答える
2

xdazzeach_with_objectの回答のように、ブロックに2つのステートメントを含める必要がないことを意味します

game.each_with_object({}){ |h, k| h[k[0]] = k[1] }

2 番目のブロック パラメーターを分解することで、これをさらに読みやすくすることができます。

game.each_with_object({}){ |hash, (name, tactic)| hash[name] = tactic }
于 2012-10-21T21:51:07.757 に答える
0

これには、Ruby の組み込みArray#to_hメソッドを使用できます。

game.to_h
#=> {"Player1"=>"P", "Player2"=>"S"}
于 2015-10-12T13:06:33.510 に答える