Hash auf bedingte Weise erstellen
Ich bin mit Ruby, Ruby on Rails 3.0.10 und ich bauen möchte einen hash-key\ - Wert-Paare in einer bedingten Weise. Das heißt, ich hinzufügen möchte, einen Schlüssel und seinen zugehörigen Wert, wenn eine Bedingung gefunden:
hash = {
:key1 => value1,
:key2 => value2, # This key2\value2 pair should be added only 'if condition' is 'true'
:key3 => value3,
...
}
Wie kann ich das tun und halten ein "gute" Lesbarkeit für den code? Bin ich "gezwungen" zu verwenden, die merge
Methode?
Kommentar zu dem Problem
Wo sind die Schlüssel und Werte kommen? Einen anderen hash?
@Ray-Toal - Keine aus einem anderen hash. Ich bin Aufbau einer hash von Grund auf.
Tut mir Leid, ich verstehe nicht. Die Daten kommen von irgendwo: ein string, eine andere hash, ein array, oder woanders. Auch wenn Sie "erstellen des hash from scratch" Sie haben die Daten. Schreiben bedingte Einfügungen in einer hash-literal nicht in Ruby; Sie können das löschen nach der Tat mit Chris Jester-Junge - Technik.
gibt es nur eine Bedingung, die steuert, alle bedingten Werte?
@backo du meinst, es gibt genau eine bedingte Wert in der gesamten hash? wenn also würde ich nur sagen, legen Sie es am Ende
InformationsquelleAutor der Frage Backo | 2011-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lieber
tap
, wie ich denke, es bietet eine sauberere Lösung als die hier beschriebenen, die von nicht dass irgendwelche hacky löschen von Elementen und durch eine klare Definition des Umfangs, in dem der hash erstellt wird.Es bedeutet auch, Sie brauchen nicht zu erklären, eine unnötige lokale Variablen, die ich immer hasse.
Falls Sie noch nicht über ihn kommen, bevor
tap
ist sehr einfach - es ist eine Methode, die aufObject
nimmt einen block und immer gibt das Objekt zurück, hieß es weiter. So ist der Aufbau einer hash-bedingt, Sie könnten dies tun:Gibt es viele interessante Anwendungen für
tap
dies ist nur ein.InformationsquelleAutor der Antwort Russell
Einen funktionalen Ansatz:
[Bearbeiten] Ruby-2.4.0 eingeführt Hash#compact, sodass wir jetzt schreiben können
hash = { ... }.compact
.InformationsquelleAutor der Antwort tokland
Wahrscheinlich am besten, es einfach zu halten, wenn Sie sich Gedanken über die Lesbarkeit:
InformationsquelleAutor der Antwort dwhalen
Zuerst bauen Sie Ihre hash folgendermassen:
Dann tun Sie dies nach dem Bau Ihrer hash:
Sei denn, Ihr hash ist gefroren oder auf andere Weise unveränderlich, dies würde effektiv nur beibehalten von Werten, die vorhanden sind.
InformationsquelleAutor der Antwort Chris Jester-Young
Halten Sie es einfach:
Diese Weise haben Sie auch optisch getrennt Ihren speziellen Fall, die möglicherweise unbemerkt, wenn es begraben ist in hash-literalen Zuordnung.
InformationsquelleAutor der Antwort Mladen Jablanović
Benutze ich
merge
und der ternäre operator für diese situation,InformationsquelleAutor der Antwort Dave Morse
WENN Sie bauen hash aus einer Art von Aufzählbaren Daten, die Sie verwenden können, zu injizieren, zum Beispiel:
InformationsquelleAutor der Antwort Dmitry Maksimov
Einfach:
Hoffe, es hilft!
InformationsquelleAutor der Antwort Dusht
Mithilfe von fetch kann nützlich sein, wenn Sie zuerst ein hash von optionalen Parametern woanders. Schauen Sie auf dieses Beispiel:
InformationsquelleAutor der Antwort Excalibur
Gleiche Idee wie Chris Jester-Junge, mit einer leichten Lesbarkeit trick
und dann nachbearbeiten, entfernen Sie die
:delete_me
EinträgeInformationsquelleAutor der Antwort Martin DeMello