La construction d'un hachage dans une manière conditionnelle
Je suis en utilisant Ruby on Rails 3.0.10 et je voudrais construire une clé de hachage\paires de valeur dans un conditionnelle façon. C'est, je voudrais ajouter une clé et sa valeur si la condition est en correspondance:
hash = {
:key1 => value1,
:key2 => value2, # This key2\value2 pair should be added only 'if condition' is 'true'
:key3 => value3,
...
}
Comment puis-je le faire et de garder un "bonnes" raisons de lisibilité pour le code? Je suis "obligé" d'utiliser le merge
méthode?
- Où sont les clés et les valeurs proviennent de? Un hachage différent?
- Toal - Pas à partir d'un hachage différent. Je suis la construction d'un hash à partir de zéro.
- Je suis désolé, je ne comprends pas. Les données doivent provenir de quelque part: une chaîne de caractères, un autre de hachage, un tableau, ou un autre endroit. Même si vous "construire la table de hachage à partir de zéro", vous devez avoir les données. L'écriture conditionnelle des insertions dans une table de hachage littérale n'est pas fait en Ruby; vous pouvez le supprimer après le fait à l'aide de Chris Bouffon,-les Jeunes de la technique.
- est-il une condition qui contrôle toutes les valeurs conditionnelles?
- DeMello - Pas. Une seule condition est utilisé afin d'ajouter ou non une seule clé\paires de valeurs.
- tu veux dire il y a exactement une valeur conditionnelle dans l'ensemble de hachage? si si je venais de dire l'insérer à la fin
Vous devez vous connecter pour publier un commentaire.
Je préfère
tap
, comme je le pense il offre une solution plus propre que ceux décrits ici en ne nécessitant pas de tout hacky la suppression d'éléments et d'en définir clairement la portée dans laquelle la valeur de hachage est en cours de construction.Cela signifie également que vous n'avez pas besoin de déclarer inutile variable locale, à laquelle j'ai toujours la haine.
Dans le cas où vous n'avez pas rencontré avant,
tap
est très simple - c'est une méthode surObject
qui accepte un bloc et toujours renvoie à l'objet qu'il a été appelé. Afin de construire une table de hachage conditionnellement vous pourriez faire ceci:Il existe de nombreuses utilisations intéressantes pour
tap
, c'est juste un.hash = Hash.new.tap do ...
condition_1 ? my_hash[:x1] : my_hash[:x2]
ouif condition_1 then my_hash[:x1] else my_hash[:x2] end
ou même multiligne fonctionne.Une approche fonctionnelle:
Remarque: Pour Ruby < 2.4.0 ou non à l'aide d'active-soutien, remplacer
.compact
par.reject { |k, v| v.nil? }
.Hash#compact
.tap
approche est (plus) lourdProbablement le meilleur pour faire simple si vous êtes inquiet au sujet de la lisibilité:
tap
mais honnêtement, c'est probablement la voie à suivre, car il ne fait pas quelque chose de compliqué ou de magique. C'est le "plus petit dénominateur commun" de la solution.Faire simple:
De cette façon, vous aussi visuellement séparé de votre cas particulier, qui pourraient être inaperçu si elle est enfouie au sein de hachage littérale d'affectation.
- Je utiliser
merge
et l'opérateur ternaire de cette situation,D'abord construire votre hash ainsi:
Puis le faire après la construction de votre hash:
À moins que votre valeur de hachage est congelés ou autrement immuable, ce serait effectivement de garder uniquement les valeurs qui sont présents.
delete_if
ligne de nuke au large de la en blanc.SI vous construisez de hachage à partir d'une sorte de Énumérable de données, vous pouvez utiliser injecter, par exemple:
Simple que cela:
Espère que cela aide!
L'aide d'extraire peut être utile si vous êtes le remplissage d'une table de hachage à partir d'attributs facultatifs quelque part d'autre. Regardez cet exemple:
Même idée que Chris Bouffon-Jeunes, avec une légère lisibilité truc
puis post-traitement pour enlever les
:delete_me
entrées