2010-11-22 5 views
0

In Python wird iter() wie folgt verwendet:Wie kann ich meinen Code an die aktuelle Position erinnern und das nächste Mal das nächste Element anzeigen?

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

Hat Rubin die gleiche Funktion haben?

habe ich versucht, diese aber es scheint, gibt es ein Problem:

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> 

Warum Rubin hat noch keinen a Variable finden?

+1

Anstatt zu versuchen, Python in Ruby neu zu erfinden, warum erzählst du uns nicht, warum '[1,2,3] .each' nicht ausreicht? –

+1

Dies ist keine Python-Frage. – martineau

Antwort

2

Ruby hat auch Iteratoren.

Die grundlegende Verwendung ist:

>> 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>' 
>> 

Sie, dass in einem Verfahren verwendet werden kann:

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

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

Ihr Ruby-Code versagt, weil a in ihrem Umfang nicht ist, mit anderen Worten, doesn Ruby‘ t siehe a innerhalb der b Methode. Die typische Art, wie es definiert werden würde, ist, wie ich es oben zeige. Also, dein Code ist nah.

Beachten Sie auch, dass wir selten eine for/Schleife in Ruby schreiben. Es gibt Gründe wie for Schleifen, die nach dem Ausführen eine lokale Variable zurücklassen, und Möglichkeit, das Ende eines Arrays zu beenden, wenn die Schleife nicht korrekt definiert ist, z. B. wenn Sie einen Index für den Zugriff auf einzelne Elemente eines Arrays erstellen. Stattdessen verwenden wir den .each Iterator, um jedes Element der Reihe nach zurückzugeben, was es unmöglich macht, über das Ende hinauszugehen und keine lokale Variable zurückzulassen.

1

Arbeiten mit dem Code, der Ihnen zur Verfügung gestellten und unter der Annahme, dass Sie die Werte wollen ausgedruckt:


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

(Es gibt viel bessere Möglichkeiten, wie Mark Thomas wies darauf hin)

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

beantwortet nicht die Frage, wie man einen "externen" Iterator in Ruby macht. nicht wie man eine Schleife macht. – mb14