我正在尝试从 ruby 的哈希表中获取第一个键和值键。我不知道哈希的键值,因为它被传递给方法。我在网上找不到任何地方如何找到第一个键/值作为单独的哈希表。我认为 hash[0]
只会尝试查找名称为 0 的元素,当我运行代码时它只会返回 nil
。
我知道我可以找到键名和值,然后从中创建一个新的散列,但我想知道是否有更简单的方法可以做到这一点,所以我马上得到一个散列。
这是我的代码:
def rps_game_winner(game)
rock_in_hash = game.invert['R']
paper_in_hash = game.invert['P']
scissors_in_hash = game.invert['S']
if(rock_in_hash)
if(paper_in_hash)
return paper_in_hash;
elsif(scissors_in_hash)
return rock_in_hash
end
elsif(paper_in_hash)
if(rock_in_hash)
return paper_in_hash
elsif(scissors_in_hash)
return scissors_in_hash
end
end
key = game.keys[-1]
value = game.values[-1]
winner = {key => value}
return winner
end
game_one = { "Bob" => 'P', "Jim" => 'P' }
puts rps_game_winner(game_one)
这让我得到了正确的结果问题是我不明白为什么它是-1而不是零......我希望有更好的方法来获取哈希表的第一个键/值对而不是创建新的哈希具有您从上一个表中检索到的键和值的表。
你可以做
key, value = hash.first
或者,如果您愿意:
key = hash.keys[0]
value = hash.values[0]
那么也许:
new_hash = {key => value}
有一个较短的答案不需要您使用额外的变量:
h = { "a" => 100, "b" => 200 , "c" => 300, "d" => 400, "e" => 500}
Hash[*h.first] #=> {"a" => 100}
或者,如果您想在任何单个位置检索键/值
Hash[*h.to_a.at(1)] #=> {"b" => 200}
或从一系列位置检索键/值:
Hash[h.to_a[1,3]] #=> {"b"=>200, "c"=>300, "d"=>400}
[hash.first].to_h
另一种方法。
my_hash = { "a" => "first", "b" => "second" }
{ my_hash.keys.first => my_hash.values.first }
这也有效
rps_game_winner': undefined method
first' for {"Jim"=>"P", "Bob"=>"P"}:Hash (NoMethodError) from t.rb:31。但真正让我大吃一惊的是,当我尝试第二种方法时(我试图避免这种方法,因为我认为有一种更简单的方法)我得到了第二个条目 Bob P,当我用键调用它时更奇怪的是 [-1 ] values[-1] 我得到了第一个条目 JimP 我完全不明白发生了什么。你有什么想法。我使用键盘来解释我的脚本。