Il y a le cas de la chaîne recenseur je ne peux pas obtenir ma tête autour:chaîne recenseur commençant par trouver
[1, 2, 3, 4, 5].find.map { |x| x * x }
#=> [1, 4, 9, 16, 25]
Ce retourne le tableau de carrés de valeur initiale, mais j'attendre pour revenir juste le [1]
J'ai essayé de tout déconstruire et c'est ce que j'ai réalisé: .map
est appelé sur un énumérateur find
pour le tableau original. Il appelle each
sur lui-même pour obtenir des valeurs pour l'itération. each
sur l'énumérateur délègue l'itération à la méthode pour laquelle l'énumérateur a été créé, c'est-à-dire find
. find
obtient le premier élément de tableau, le restitue, et il continue à être cédé jusqu'à ce qu'il atteigne le bloc dans l'exemple. La valeur est au carré, le bloc le renvoie, le bloc each
sous-jacent dans map
renvoie la définition [1], il descend au find
, et puisqu'il est true
dans un sens booléen, je m'attends à ce que find
revienne à ce point, finissant effectivement l'itération, mais en quelque sorte, il continue à alimenter les valeurs du tableau jusqu'au bloc map
.
Ce n'est pas un exemple du monde réel, j'essaie juste de comprendre comment lire ces chaînes correctement, et cette affaire m'a dérouté.
UPD
Comme il a été suggéré à plusieurs reprises que find
étant appelé sans de défaillance »retourne bloc recenseur, voici un exemple:
[1, 2, 3, 4, 5].find
#=> #<Enumerator: [1, 2, 3, 4, 5]:find>
[1, 2, 3, 4, 5].find.each { |x| x < 4 }
#=> 1
Appel 'find' sans un bloc fait pas beaucoup de sens, il retourne [par défaut' EACH_ENUMERATOR' ] (https://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-find) (cliquez sur "show source".) – mudasobwa
Nitpicking, mais 'find' retournerait un seul élément ('1'), pas un tableau (' [1] '). – Stefan
@mudasobwa '[1,2,3,4,5] .find' renvoie' # ', et il y a juste' RETURN_ENUMERATOR' dans la source. Peut-être que je ne regarde pas dans la bonne direction? Mais oui, cela n'a aucun sens, c'est juste un exemple synthétique pour illustrer un comportement étrange. –
Roman