J'ai une liste de valeurs qui sont dans un hachage Ruby. Existe-t-il un moyen de vérifier la valeur de la clé et si elle est égale à "X", alors faites "Y"?
Je peux tester pour voir si le hachage a une clé en utilisant hash.has_key?
, mais maintenant je dois savoir if hash.key == "X" then...
?
Les hachages sont indexés à l'aide des crochets ([]). Tout comme les tableaux. Mais au lieu de l'indexation avec l'index numérique, les hachages sont indexés en utilisant soit le littéral de chaîne que vous avez utilisé pour la clé, soit le symbole. Donc, si votre hachage est similaire à
hash = { "key1" => "value1", "key2" => "value2" }
vous pouvez accéder à la valeur avec
hash["key1"]
ou pour
hash = { :key1 => "value1", :key2 => "value2"}
ou le nouveau format pris en charge dans Ruby 1.9
hash = { key1: "value1", key2: "value2" }
vous pouvez accéder à la valeur avec
hash[:key1]
Cette question semble ambiguë.
Je vais essayer avec mon interprétation de la demande.
def do_something(data)
puts "Found! #{data}"
end
a = { 'x' => 'test', 'y' => 'foo', 'z' => 'bar' }
a.each { |key,value| do_something(value) if key == 'x' }
Cela bouclera sur toutes les paires clé/valeur et ne fera quelque chose que si la clé est "x".
En complément de par ex. @Intrepidd répond, dans certaines situations, vous souhaitez utiliser fetch
au lieu de []
. Pour que fetch
ne lève pas d'exception lorsque la clé n'est pas trouvée, transmettez-lui une valeur par défaut.
puts "ok" if hash.fetch('key', nil) == 'X'
Référence: https://docs.Ruby-lang.org/en/2.3.0/Hash.html .
Que dis-tu de ça?
puts "ok" if hash_variable["key"] == "X"
Vous pouvez accéder aux valeurs de hachage avec l'opérateur []
Il semble que votre question soit peut-être un peu ambiguë.
Si "valeurs" dans la première phrase signifie n'importe quelle valeur générique (c'est-à-dire objet, puisque tout dans Ruby peut être vu comme un objet), alors l'une des autres réponses vous indique probablement ce que vous devez savoir (c'est-à-dire utiliser Hash#[]
(par exemple hash[some_key]
) pour trouver la valeur associée à une clé).
Si, toutefois, les "valeurs" dans la première phrase sont considérées comme signifiant la partie valeur des "clés, paires de valeurs" (telles qu'elles sont stockées dans des hachages), votre question semble concerner le fait de travailler dans l'autre sens (clé pour une valeur donnée).
Vous pouvez trouver une clé qui mène à une certaine valeur avec Hash#key
.
Ruby-1.9.2-head :001 > hash = { :a => '1', :b => :two, :c => 3, 'bee' => :two }
=> {:a=>"1", :b=>:two, :c=>3, "bee"=>:two}
Ruby-1.9.2-head :002 > a_value = :two
=> :two
Ruby-1.9.2-head :003 > hash.key(a_value)
=> :b
Si vous utilisez un Ruby antérieur à 1.9, vous pouvez utiliser Hash#index
.
Lorsqu'il existe plusieurs clés avec la valeur souhaitée, la méthode ne renvoie qu'une seule d'entre elles. Si vous voulez toutes les clés avec une valeur donnée, vous devrez peut-être répéter un peu:
Ruby-1.9.2-head :004 > hash[:b] == hash['bee']
=> true
Ruby-1.9.2-head :005 > keys = hash.inject([]) do # all keys with value a_value
Ruby-1.9.2-head :006 > |l,kv| kv[1] == a_value ? l << kv[0] : l
Ruby-1.9.2-head :007?> end
=> [:b, "bee"]
Une fois que vous avez une clé (les clés) qui mène à la valeur, vous pouvez les comparer et agir sur elles avec if/unless/case
expressions, méthodes personnalisées qui prennent des blocs, et cetera. La façon dont vous les comparez dépend du type d'objets que vous utilisez pour les clés (les gens utilisent souvent des chaînes et des symboles, mais Ruby les hachages peuvent utiliser n'importe quel type d'objet comme clés (tant qu'ils sont pas modifiés alors qu'ils servent de clés)).
Je n'ai pas bien compris votre problème mais je pense que c'est ce que vous recherchez (selon ma compréhension)
person = {"name"=>"BillGates", "company_name"=>"Microsoft", "position"=>"Chairman"}
person.delete_if {|key, value| key == "name"} #doing something if the key == "something"
Output: {"company_name"=>"Microsoft", "position"=>"Chairman"}