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?
Réponses
Trop de publicités? 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
.
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
.
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.