ruby ​​hash autovivification (Facetten)

8

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?

    
artemave 01.10.2009, 12:29
quelle

3 Antworten

18
___ answer17867644 ___

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).

    
___ tag123ruby ___ Ruby ist eine multi-plattform Open-Source, dynamische objektorientierte interpretierte Sprache, erstellt von Yukihiro Matsumoto (Matz) im Jahr 1995. Die [Ruby] -Tag ist für Fragen im Zusammenhang mit der Ruby-Sprache, einschließlich seiner Syntax und seiner Bibliotheken . Fragen speziell zum Ruby-on-Rails-Framework sollten mit [ruby-on-rails], nicht [ruby] getaggt werden. Verwenden Sie dies nicht, um Ruby in der japanischen Sprache zu markieren. ___ qstntxt ___

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?

    
___ qstnhdr ___ ruby ​​hash autovivification (Facetten) ___ answer1598433 ___

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.

    
___ answer1503765 ​​___

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.

    
___
mikej 01.10.2009, 12:49
quelle
8

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.

    
Peter Wagenet 21.10.2009 02:28
quelle
-1

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).

    
Brian K 25.07.2013 20:00
quelle

Tags und Links