2

这是一个石头剪刀布游戏。从 irb,game.class 说它是一个数组。我希望找到赢得比赛的人的姓名(在本例中为 Player2)。

游戏 = [[“玩家 1”,“P”],[“玩家 2”,“S”]]

想到的方法是返回一个拆分名称值的哈希。然后通过该值搜索该哈希以获取玩家名称。

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

使用each_with_object意味着您不需要在块中有两个语句,就像在 xdazz 的答案中一样

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

您可以通过解构第二个块参数来使其更具可读性

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 回答