2014-07-13 4 views
1

Dans le code ci-dessous, j'essaie d'ajouter du texte à une valeur de chaîne si une clé est définie. Si la clé n'est pas définie, elle définit simplement la paire clé/valeur avec le texte.Ajouter à la valeur si la clé est définie, déclarer si elle n'est pas définie

if my_hash.key?(:my_key) 
    my_hash[:my_key] << 'My text' 
else 
    my_hash[:my_key] = 'My text' 
end 

Y a-t-il une meilleure façon de procéder?

+0

Essayez ceci: 'my_hash [: my_key] = my_hash [:] my_key .presence.to_s + « Mon text'': si 'my_hash [: my_key] 'est' nil', il appellera 'nil.to_s', ce qui retourne une chaîne vide – MrYoshiji

+2

Pas besoin de' présence', vous pouvez utiliser 'my_hash [: my_key] = mon_hash [: ma_key] .to_s + 'Mon text''. Voir [ici] (http://stackoverflow.com/questions/6196484/how-to-append-a-string-to-a-variable-that-either-exists-or-not) –

+0

Parfait! Les deux solutions fonctionnent donc je suppose que le moins verbeux est le meilleur. Pourquoi cela fonctionne-t-il? would_s donner une erreur si la clé n'est pas définie? – Elmer

Répondre

2

Vous pouvez définir un hachage par défaut avec une chaîne vide. , Vous ne devez donc pas prendre soin des valeurs nulles:

hash = Hash.new { |h, k| h[k] = '' } 
hash[:key] << 'string' 

puts hash 
# => { :key => 'string' } 
0

Comme le suggère MrYoshiji et Damien Roche la solution à la question est la suivante:

my_hash[:my_key] = my_hash[:my_key].to_s + 'My text' 

De plus, si le texte doit être séparé par un espace en cas :my_key a valeur définie cela peut être fait:

my_hash[:my_key] = [ my_hash[:my_key].to_s, 'My text' ].reject(&:empty?).join(' ') 

Cela pourrait alors être enveloppé dans une fonction d'aide pour rendre les choses un peu plus facile:

def add_str(str, new_str) 
    [str.to_s, new_str].reject(&:empty?).join(' ') 
end 

my_has[:my_key] = add_str my_has[:my_key], 'My text' 
Questions connexes