1

列挙子の最後にあることを実現するための優雅な方法はありますか?

例えば、

a = (1..10).to_a
e = a.each
e.next # should yield 1
while e.next
  # do something
end

もちろん、列挙子の最後に到達すると、eはStopIteration を発生させます。

レスキューなしでwhileループから抜け出すための良い方法はありますか?私はe.eachとだけ言うことができることを知っています(または列挙子をまったく使用しない)が、私の特定の問題については、最初の数回の反復で特別なことを行い、最後の数回で一般的なことをしたいと思います。

次の値を見てnil、エラーの代わりに取得する方法が必要です。

任意のヒント?私が行方不明になっていることはおそらく明らかです...

NB。列挙子を使用する必要はありませんが、問題を解決する最も簡単な方法のようです。したがって、列挙子以外のソリューション(列挙型を反復処理するため)がある場合は、自由に共有してください。(その点で、多分私はそれぞれまたはeach_with_indexを使用し、特別な場合にはカウンターを使用する必要があります...)

4

2 に答える 2

4

からの救助StopIterationはそれを行う方法です。そして唯一の方法。*

によって返される値(たとえばnil、あなたが提案するように)nextが列挙可能な次の値である可能性があることに気付いた場合、特殊なケースの値を返すことは不可能であることが明らかになります。。これが、より「優雅な」何かをするのではなく、完了したときにnextレイズしなければならない理由です。StopIteration

*使用する必要があると仮定するとEnumerator、実際の問題を解決するためのより良い方法がおそらくあるためです。

于 2012-11-16T01:47:14.720 に答える
1

each_with_index最初のNに特別な動作をするように提案するように使用することの何が問題になっていますか?このパターンは常に表示されます。

a.each_with_index do |e, i|
  if (i <= n)
    # Do special stuff
  end
  # Do regular stuff
end

列挙可能なツールボックスには、利用できるツールがたくさんあります。

于 2012-11-16T04:28:20.910 に答える