7

Rubyでブロックを繰り返すのは簡単です。それはきれいに終了し、残りのコードに進みます。

一方、列挙子で繰り返すのは少し混乱します。ブロックなしで:eachを呼び出すと、代わりに列挙子が返されます。次に、列挙子で:nextを呼び出して、次の各反復値を取得できます。

そして奇妙な部分-反復が完了すると、列挙子がnilを返す代わりに、「反復は最後に到達しました」という例外をスローします。その結果、値も返されません。

例えば:

test = [ 'test_value' ]
enumerator = test.each
enumerator.next
>> "test_value"
enumerator.next
>> StopIteration: iteration reached at end

これは、列挙子がnil値を返すことができるようにするためだけの理由ですか?答えは私がこれを投稿するときにのみ私に起こります(それで私はまだそれを投稿するつもりです)が、そうであるに違いないようです。

もしそうなら、これはそのような問題を処理する典型的な方法ですか?例外を使用して、基本的に期待どおりに実行されるコードを処理するのは奇妙に思えます。

4

2 に答える 2

7

nilその理由は、列挙子によって有効な値として返されるためであることは正しいです。これが典型的かどうかというあなたの質問に答えるために、Python は とも呼ばれる例外を使用して同じ方法で処理します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

もちろん、ほとんどの場合、next直接呼び出されることはありません (eachまたはfor代わりにループが使用されます)。そのため、この基礎となるメカニズムはそれほど頻繁には公開されません。

于 2010-07-09T15:39:38.860 に答える
4

ええ、nil はまだ結果です。これは、返す値がないこととは異なります。基本的に、そこにない変数またはメモリ内の場所にアクセスしようとするのと同じです。これが、nil を返すのではなく、例外が必要な理由です。あなたはそれを理解したようですね:-)

于 2010-07-09T12:40:42.593 に答える