Warum gibt Enumerable # find / # detect ein Array zurück, auch wenn es auf einem Hash aufgerufen wird?

8

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%     
steveyang 27.04.2013, 10:03
quelle

3 Antworten

5

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

ist
  

"... 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:

  

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.

%Vor%

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.

    
steveyang 18.05.2013, 18:00
quelle
3

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.

    
Sergio Tulentsev 27.04.2013 10:06
quelle
0

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”

    
Arup Rakshit 27.04.2013 10:25
quelle

Tags und Links