web-dev-qa-db-fra.com

Comment obtenir la première paire clé / valeur à partir d’une table de hachage dans Ruby

J'essaie d'obtenir la première clé et la clé de valeur à partir d'une table de hachage en Ruby. Je ne connais pas les valeurs clés du hachage car il est transmis à la méthode. Je ne peux trouver nulle part en ligne comment trouver la première clé/valeur en tant que table de hachage séparée. Je pense hash[0] essaiera simplement de trouver un élément avec un nom 0. Il retournera simplement nil lorsque je lancerai le code.

Je sais que je peux trouver le nom de la clé et la valeur, puis créer un nouveau hachage à partir d’eux, mais je me demande s’il existe un moyen plus facile de le faire, alors j’obtiens un hachage immédiatement.

voici mon code:

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)

Cela me donne le résultat correct. Le problème est que je ne comprends pas pourquoi c'est -1 au lieu de zéro ... Et j'espérais qu'il y avait un meilleur moyen d'obtenir la première paire clé/valeur d'une table de hachage au lieu de créer un nouveau hachage table avec la clé et la valeur extraites de la table précédente.

52
Xitcod13

Vous pouvez juste faire

key, value = hash.first

ou si vous préférez:

key = hash.keys[0]
value = hash.values[0]

Alors peut-être:

new_hash = {key => value}
138
pguardiario

Il y a un réponse plus courte qui ne vous oblige pas à utiliser de variables supplémentaires:

h = { "a" => 100, "b" => 200 , "c" => 300, "d" => 400, "e" => 500}
Hash[*h.first] #=> {"a" => 100}

Ou si vous voulez récupérer une clé/valeur à une position unique

Hash[*h.to_a.at(1)] #=> {"b" => 200}

Ou récupérer une clé/des valeurs d'une plage de positions:

 Hash[h.to_a[1,3]] #=> {"b"=>200, "c"=>300, "d"=>400}
35
metakungfu