73 votes

Clojure: repos vs suivant

J'ai du mal à comprendre la différence entre rest et next dans Clojure. La page du site officiel sur la paresse indique que la préférence devrait probablement être d'utiliser rest , mais cela n'explique pas vraiment la différence entre les deux. Quelqu'un peut-il donner un aperçu?

68voto

sepp2k Points 157757

Comme décrit dans la page que vous avez liée, next est plus strict que (le nouveau comportement de) rest car il faut évaluer la structure des inconvénients paresseux pour savoir s'il faut renvoyer nil ou un seq.

rest d'autre part renvoie toujours un seq, donc rien ne doit être évalué jusqu'à ce que vous utilisiez réellement le résultat de rest . En d'autres termes, rest est plus paresseux que next .

35voto

nickik Points 3112

Il est facile si vous avez ceci:

(next '(1))
=> nil

Donc, next regarde la prochaine chose et si la ligne est vide, il retourne nil au lieu d'un vide seq. Cela signifie qu'il faut regarder de l'avant (pour le premier point, il serait de retour) ce qui le rend pas pleinement paresseux (peut-être que vous n'avez pas besoin de la valeur suivante, mais next déchets le temps de calcul de regarder vers l'avenir).

(rest '(1))
=> ()

rest n'a pas l'air de l'avant et retourne le reste de la seq.

Vous pensez peut-être, Pourquoi même pas la peine à l'aide de deux choses différentes ici? La raison en est que, normalement, vous voulez savoir si il n'y a plus rien dans le seq et juste retour nil, mais dans certains cas où la performance est très important et d'évaluer un élément de plus qui pourrait signifier l'effort énorme que vous pouvez utiliser rest.

22voto

Stuart Sierra Points 5671

next , c'est comme (seq (rest ...)).

rest sera de retour le morceau restant d'une séquence. Si ce morceau de la séquence n'a pas encore été réalisé, rest n'a pas la force. Il ne sera même pas vous dire si il y a plus d'éléments à gauche dans la séquence.

next fait la même chose, mais ensuite les forces de l'au moins un élément de la séquence à être réalisé. Donc, si next retours nil, vous savez il n'y a plus d'éléments à gauche dans la séquence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X