Ruby agent Recenseur, Pourquoi en Finir avec l'Exception?
-
13-09-2020 - |
Question
L'itération d'un bloc en Ruby, c'est assez simple, il termine proprement et produit sur le reste du code.
Itération avec un agent Recenseur, d'autre part, est un peu plus confus.Si vous appelez :chaque sans un bloc, un agent Recenseur est retourné à la place.:la prochaine peut ensuite être appelée sur l'Énumérateur pour obtenir chaque côté itératif de la valeur.
Et puis l'étrange partie - lorsque l'itération est terminée, au lieu de l'Énumérateur de retour nul, il déclenche une exception:"itération atteint à la fin".Le résultat est qu'il n'a même pas de retourner une valeur.
Par exemple:
test = [ 'test_value' ]
enumerator = test.each
enumerator.next
>> "test_value"
enumerator.next
>> StopIteration: iteration reached at end
C'est la raison pour ceci tout simplement afin que nul valeurs peuvent être retournés par l'agent Recenseur?La réponse se présente à moi seul que je poste ce (donc je vais le poster quand même), mais il semble que cela doit être le cas.
Si c'est le cas, est-ce une façon habituelle de traiter de telles questions?Il semble étrange d'utiliser une Exception pour gérer le code qui effectue essentiellement comme prévu.
La solution
Il est exact que la raison en est ainsi que nil
peuvent être retournés comme une valeur valide par l'agent Recenseur.Pour répondre à votre question de savoir si ce est typique, Python gère de la même manière à l'aide d'une exception aussi appelé StopIteration
.
>>> my_list = [1,2,3]
>>> i = iter(my_list)
>>> i.next()
1
>>> i.next()
2
>>> i.next()
3
>>> i.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Bien sûr, la plupart du temps next
n'est pas appelé directement (each
ou un for
boucle étant utilisé à la place) donc ce mécanisme sous-jacent n'est pas exposé souvent.
Autres conseils
Ouais, nil est toujours un résultat différent de ne pas avoir de valeur à revenir.Il est essentiellement la même chose que d'essayer d'accéder à une variable ou à un emplacement en mémoire qui n'est pas là.C'est pourquoi vous voulez une exception plutôt que de retourner un nil.On dirait que vous avez compris que: -)