Hier ist ein cleverer Trick, um die Hash-Autovivifizierung in Ruby (aus Facetten) zu aktivieren:
%Vor%Obwohl es (natürlich) funktioniert, finde ich es wirklich frustrierend, dass ich nicht herausfinden kann, wie dieser Zweiliner das macht, was er tut.
leet wird als Standardwert verwendet. Wenn man also nur auf h['new_key']
zugreift, wird es irgendwie aktiviert und erzeugt 'new_key' => {}
Nun würde ich erwarten, dass h['new_key']
das Standard-Objekt zurückgibt, anstatt es zu bewerten. Das heißt, 'new_key' => {}
wird nicht automatisch erstellt. Wie heißt Leet eigentlich? Vor allem mit zwei Parametern?
Alternativ könntest du mein xkeys-Juwel berücksichtigen. Es ist ein Modul, mit dem Sie Arrays oder Hashes erweitern können, um verschachtelten Zugriff zu ermöglichen.
Wenn Sie nach etwas suchen, das noch nicht existiert, erhalten Sie einen Nullwert (oder einen anderen Wert oder eine Ausnahme, wenn Sie das bevorzugen), ohne etwas zu erstellen, indem Sie suchen. Es kann auch an das Ende von Arrays angehängt werden.
Sie können entweder Hashes oder Arrays für Ganzzahlschlüssel autovivifizieren (aber nur einmal für die gesamte Struktur).
Hier ist ein cleverer Trick, um die Hash-Autovivifizierung in Ruby (aus Facetten) zu aktivieren:
%Vor%Obwohl es (natürlich) funktioniert, finde ich es wirklich frustrierend, dass ich nicht herausfinden kann, wie dieser Zweiliner das macht, was er tut.
leet wird als Standardwert verwendet. Wenn man also nur auf leet
zugreift, wird es irgendwie aktiviert und erzeugt leet
Nun würde ich erwarten, dass autonew
das Standard-Objekt zurückgibt, anstatt es zu bewerten. Das heißt, hsh[key]
wird nicht automatisch erstellt. Wie heißt Leet eigentlich? Vor allem mit zwei Parametern?
Es ist auch erwähnenswert, dass dieser Code wie folgt zu einem einzigen Liner gemacht werden kann:
%Vor%Der Aufruf von Hash # default_proc gibt das Proc zurück, das zum Erstellen des Parents verwendet wurde, daher haben wir hier ein schönes rekursives Setup.
Ich rede von einem ähnlichen Fall das auf meinem Blog.
Die standardmäßige neue Methode für Hash akzeptiert einen Block. Dieser Block wird aufgerufen, wenn versucht wird, auf einen Schlüssel im Hash zuzugreifen, der nicht existiert. Der Block wird an den Hash selbst und den Schlüssel übergeben, der angefordert wurde (die beiden Parameter) und sollte den Wert zurückgeben, der für den angeforderten Schlüssel zurückgegeben werden soll.
Sie werden feststellen, dass das %code% lambda 2 Dinge tut. Es gibt einen neuen Hash mit %code% selbst als Block für die Behandlung von Standardwerten zurück. Dies ist das Verhalten, das %code% erlaubt, für Hashes beliebiger Tiefe zu arbeiten. Er weist diesen neuen Hash auch %code% zu, damit Sie beim nächsten Mal, wenn Sie den gleichen Schlüssel anfordern, den vorhandenen Hash erhalten, anstatt einen neuen zu erstellen.
Es ist auch erwähnenswert, dass dieser Code wie folgt zu einem einzigen Liner gemacht werden kann:
%Vor%Der Aufruf von Hash # default_proc gibt das Proc zurück, das zum Erstellen des Parents verwendet wurde, daher haben wir hier ein schönes rekursives Setup.
Ich rede von einem ähnlichen Fall das auf meinem Blog.
Alternativ könntest du mein xkeys-Juwel berücksichtigen. Es ist ein Modul, mit dem Sie Arrays oder Hashes erweitern können, um verschachtelten Zugriff zu ermöglichen.
Wenn Sie nach etwas suchen, das noch nicht existiert, erhalten Sie einen Nullwert (oder einen anderen Wert oder eine Ausnahme, wenn Sie das bevorzugen), ohne etwas zu erstellen, indem Sie suchen. Es kann auch an das Ende von Arrays angehängt werden.
Sie können entweder Hashes oder Arrays für Ganzzahlschlüssel autovivifizieren (aber nur einmal für die gesamte Struktur).
Tags und Links ruby