Die Dokumentation für Enumerable#find
/ #detect
lautet:
find(ifnone = nil) { |obj| block } → obj or nil
find(ifnone = nil) → an_enumerator
Übergibt jeden Eintrag in enum an block . Gibt das erste für den Block zurück ist nicht falsch. Wenn kein Objekt übereinstimmt, ruft ifnone auf und gibt sein Ergebnis, wenn es angegeben ist, oder gibt
nil
andernfalls zurück.
Wenn es jedoch im Hash aufgerufen wird, hat das Ergebnis den Typ in Array anstelle des ursprünglichen Hash geändert.
Ist es ein Implementierungsfehler oder einige historische Konventionen bezüglich dieses Datentyps?
%Vor% Der Hash#detect
wird von Enumerable#detect
method geerbt.
Enumerable
Modul generiert mehrere Methoden (wie sort
, min
, max
einschließlich detect
usw.) basierend auf der each
Methode der Klasse, die Enumerable
enthält.
Es ist nicht wichtig, wie each
implementiert wird, solange es
"... ergibt aufeinanderfolgende Mitglieder der Sammlung." aus ruby-doc
Bei der Methode Hash#detect
hängt es also vom Verhalten von Hash#each
ab, das heißt:
%Vor%Aufrufe blockieren einmal für jeden Schlüssel in hsh und übergeben das Schlüssel / Wert-Paar als Parameter. Wenn kein Block angegeben ist, wird stattdessen ein Enumerator zurückgegeben.
Da Hash#each
den Hash als Paar aus zwei Paaren liefert, funktionieren alle Methoden, die vom Modul Enumerable
geerbt wurden, auf dieser Grundlage.
Deshalb erzeugt Hash#detect
anstelle eines Hash-Objekts selbst ein Array mit zwei Elementen.
find
wird in each
implementiert. Und each
gibt Schlüsselwertpaare in Form von Arrays mit je 2 Elementen zurück, wenn sie auf einem Hash aufgerufen werden. Deshalb gibt find
ein Array zurück.
Verwenden von detect / find mit Hashes
Mit hashes übergibt detect / find jedes Schlüssel / Wert-Paar im Hash an den Block, den Sie entweder "fangen" können:
Ein Array aus zwei Elementen mit dem Schlüssel als Element 0 und dem entsprechenden Wert als Element 1, oder
%Vor%Ausgabe:
%Vor%Zwei separate Elemente, wobei der Schlüssel das erste Element und der entsprechende Wert das zweite Element ist.
%Vor%Ausgabe:
%Vor% Um mehr zu diesem Thema zu erfahren, schauen Sie hier Enumerating Ruby’s “Enumerable” Module, Part 3: “detect”, a.k.a. “find”Enumerating Ruby’s “Enumerable” Module, Part 3: “detect”, a.k.a. “find”
Tags und Links ruby arrays hash enumerable