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.

Était-ce utile?

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: -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top