2010-11-22 9 views
0

このように使用iter()がある:コードで現在位置を覚えておいて、次回の要素を表示するにはどうすればよいですか? Pythonで

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

Rubyは同じ機能を持っていますか?

私はこれを試してみましたが、問題があるようだ。

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> 

なぜRubyはa変数を見つけられませんでしたか?

+1

RubyでPythonを再開発するのではなく、 '[1,2,3] .each'で十分ではない理由を教えてください。 –

+1

これはPythonの質問ではありません。 – martineau

答えて

2

Rubyにはイテレータもあります。

基本的な使用である:あなたが使用することができます

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

方法であること:aはつまり、スコープにないので

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

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

あなたのRubyコード失敗して、Rubyは」doesnのbメソッド内のaを参照してください。それが定義される典型的な方法は、私が上に示したとおりです。したがって、あなたのコードは近いです。

また、Rubyでは/ forループを書くことはほとんどありません。実行後にローカル変数を残すループや、配列の個々の要素にアクセスするためのインデックスを作成する場合など、ループが正しく定義されていない場合は、配列の最後から実行される可能性があります。代わりに、.eachイテレータを使用して各要素を順番に返すため、ローカル変数を残さずに終了することは不可能です。

1

あなたが提供されたコードでの作業、そしてあなたが値をプリントアウトしたいと仮定:


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

Mark Thomasが指摘したようにより良い方法があります)

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

これはRubyで「外部」イテレータを行う方法である質問には答えません。ループを行う方法ではありません。 – mb14