2010-11-22 56 views
0

En Python, il est iter() utilisé comme ceci:Comment faire pour que mon code mémorise la position actuelle et que la prochaine fois affiche l'élément suivant?

>>> a=[1,2,4] 
>>> b=iter(a) 
>>> b.next() 
1 
>>> b.next() 
2 
>>> b.next() 
4 
>>> b.next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> 

Est-ce que Ruby ont la même fonction?

J'ai essayé, mais il semble qu'il y ait un problème:

ruby-1.9.2-p0 > a=[1,2,3] 
=> [1, 2, 3] 
ruby-1.9.2-p0 > def b() 
ruby-1.9.2-p0 ?> for i in a 
ruby-1.9.2-p0 ?> yield i 
ruby-1.9.2-p0 ?> end 
ruby-1.9.2-p0 ?> end 
=> nil 
ruby-1.9.2-p0 > b 
NameError: undefined local variable or method `a' for #<Object:0xb7878950> 

Pourquoi ne pas Ruby trouver la variable a?

+1

Plutôt que d'essayer de réinventer Python dans Ruby, pourquoi ne pas nous dire pourquoi '[1,2,3] .each' n'est pas suffisant? –

+1

Ce n'est pas une question Python. – martineau

Répondre

2

Ruby a aussi des itérateurs.

L'utilisation de base est:

>> iter = [0,1,2,3].each #=> #<Enumerator: [0, 1, 2, 3]:each> 
>> iter.next #=> 0 
>> iter.next #=> 1 
>> iter.next #=> 2 
>> iter.next #=> 3 
>> iter.next 
StopIteration: iteration reached an end 
     from (irb):6:in `next' 
     from (irb):6 
     from /Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin/irb:16:in `<main>' 
>> 

Vous pouvez l'utiliser dans une méthode:

def iter(ary) 
    ary.each do |i| 
    yield i 
    end 
end 

iter([1,2,3]) { |i| puts i} 
# >> 1 
# >> 2 
# >> 3 

Votre code Ruby échoue parce que a n'est pas portée, en d'autres termes, Ruby n » t voir a à l'intérieur de la méthode b. La façon typique de la définir est telle que je la montre ci-dessus. Donc, votre code est proche. Notez également que nous écrivons rarement une boucle/pour Ruby. Il existe des raisons telles que for laissant une variable locale derrière après l'exécution, et la possibilité d'exécuter la fin d'un tableau si la boucle n'est pas définie correctement, par exemple si vous créez un index pour accéder à des éléments individuels d'un tableau. Au lieu de cela, nous utilisons l'itérateur .each pour renvoyer chaque élément l'un après l'autre, ce qui rend impossible de quitter la fin et de ne pas laisser de variable locale derrière.

1

Travailler avec le code qui vous avez fourni, et en supposant que vous voulez que les valeurs à être imprimées:


a = [1, 2, 3] 
def b(a) 
    a.each { |i| puts i } 
end 
b(a) 

(Il y a de bien meilleures façons, comme Mark Thomas souligné)

1
[1,2,4].each { |i| puts i } 
+0

qui ne répond pas à la question de savoir comment faire un itérateur "externe" dans Ruby. pas comment faire une boucle. – mb14