0Pricing
Ruby Academy · レッスン

Enumerator オブジェクト

外部反復を扱います。

「Enumerator オブジェクト」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。

外部反復

Enumeratorは反復処理を表すオブジェクトです。外部反復をサポートしており、eachにブロックを渡す代わりに、nextで値を1つずつ取得します。

enum = [10, 20, 30].each
puts enum.next
puts enum.next

Enumerator を取得する

eachなどの反復処理メソッドをブロックなしで呼び出すと、実行される代わりに Enumerator が返されます。

enum = [1, 2, 3].each
puts enum.class

next で取得する

nextを呼び出すたびに、次の要素が返されます。Enumeratorは現在位置を記憶しています。

letters = ["a", "b", "c"].each
puts letters.next
puts letters.next
puts letters.next

末尾で StopIteration

値がなくなると、nextはStopIterationを発生させます。これを rescue して、処理を正常に停止できます。

enum = [1, 2].each
begin
  loop { puts enum.next }
rescue StopIteration
  puts "done"
end

peek と rewind

peekは位置を進めずに次の値を確認し、rewindは先頭に戻します。

enum = [5, 6, 7].each
puts enum.peek
puts enum.next
enum.rewind
puts enum.next

独自の Enumerator を構築する

Enumerator.newを使って独自の Enumerator を作成できます。ブロックは yielder yを受け取り、y <<またはy.yieldで値を追加します。

evens = Enumerator.new do |y|
  n = 0
  loop do
    y << n
    n += 2
  end
end
puts evens.next
puts evens.next
puts evens.next

無限 Enumerator

値を取得する方式であるため、独自の Enumerator は無限にできます。必要な分だけ取得できます。

counter = Enumerator.new do |y|
  i = 1
  loop { y << i; i += 1 }
end
p counter.first(5)

Enumerator は Enumerable

Enumeratorは Enumerable をインクルードしているため、通常のメソッド(map、select、take)も使えます。内部反復と外部反復を組み合わせられます。

fib = Enumerator.new do |y|
  a, b = 0, 1
  loop do
    y << a
    a, b = b, a + b
  end
end
p fib.take(8)

with_index

with_indexは任意の Enumerator にインデックスを付加します。必要に応じて、任意の番号から開始できます。

["x", "y", "z"].each.with_index(1) do |item, i|
  puts "#{i}: #{item}"
end

each から Enumerator を返す

独自のクラスでは、ブロックが渡されなかった場合にto_enum(:each)(またはenum_for)を返すと、呼び出し元が外部反復できるようになります。

class Trio
  def each
    return to_enum(:each) unless block_given?
    yield 1; yield 2; yield 3
  end
end
e = Trio.new.each
puts e.next
puts e.next

まとめ

Enumeratorを使うと、細かく制御できます。

  • nextで値を取り出したり、先読みしたり、巻き戻したりできます。
  • Enumerator.newとyielderを使って、独自のものを作成できます。
  • Enumerableなので、map/select/takeをすべて使用できます。
odds = Enumerator.new do |y|
  n = 1
  loop { y << n; n += 2 }
end
p odds.first(4)

簡単な確認

Enumeratorオブジェクトについての理解度を確認します。

まとめ

Enumeratorオブジェクトについて学びました。

  • next、peek、rewindを使った外部イテレーション
  • StopIterationが終了を通知する
  • Enumerator.new { |y| ... }を使って独自のものを作成できる
  • Enumerableであり、無限にすることもできる
nums = Enumerator.new { |y| 1.upto(3) { |n| y << n } }
puts nums.next
puts nums.next

よくある質問

「Enumerator オブジェクト」レッスンは無料ですか?

はい。「Enumerator オブジェクト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。

「Enumerator オブジェクト」で何を学びますか?

外部反復を扱います。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Ruby Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Enumerator オブジェクト」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このRuby Academyレッスンでコードを書いて実行できますか?

はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. カスタム each の記述
  2. Enumerable のインクルード
  3. 遅延 Enumerator
  4. Enumerator オブジェクト
← Ruby Academyに戻る