イテラブルとは何か調べてみた
はじめに
エラーで以下のようなメッセージを見たことがある方も多いはずです。
~ is not iterable ...
この iterable とはなんでしょうか?
この記事で、イテラブルとは何か、その基本についてまとめていきます。
イテラブルとは?
イテラブル(iterable)とは、反復処理が可能なオブジェクトのことです。
これは、for...of ループを使って、その中の要素を一つずつ順番に取り出せる能力を持つオブジェクトを指します。
ではなぜ、オブジェクトが反復可能なのでしょうか?
それは、内部にイテレーターという仕組みを持っているためです。
イテラブルなものの例
JavaScriptでは、以下のようなものがイテラブルです。
- 配列(Array):[1, 2, 3]
- 文字列(String):"Hello"
- マップ(Map):new Map()
- argumentsオブジェクト
など
これらのオブジェクトは、内部にイテレーターと呼ばれる特別な仕組みを持っており、それが要素を一つずつ提供する役割を果たします。
イテレーターとイテラブルの違い
イテラブル (Iterable)
イテラブルは、forループなどで反復処理できる「コンテナ」のようなオブジェクトです。
= 反復可能なオブジェクトそのもの
リスト、タプル、文字列などがこれに該当します。
イテラブルは、反復処理を要求されたときにイテレーターを生成する能力を持っています。
(__iter__
メソッドを実装しており、このメソッドが呼ばれると、イテレーターを返します)
イテレーター (Iterator)
イテレーターは、イテラブルの要素を1つずつ取り出すためのオブジェクトです。
イテラブルから実際に要素を一つずつ取り出すための状態を持ちます。
= イテラブルなオブジェクトから要素を一つずつ取り出すための道具
__next__
メソッドを実装しており、呼び出されるたびに次の要素を返します。
要素がなくなると StopIteration 例外を送出して終了を知らせます。
for...of ループは、内部でイテラブルなオブジェクトからイテレーターを取得し、そのイテレーターを使って反復処理を実行します。
例えば、for (const char of "Hello")というコードは、文字列 "Hello" が持っているイテレーターを使い、"H", "e", "l", "l", "o"を順番に取り出しています。
イテラブルの重要性
イテラブルの概念があることで、さまざまなデータ構造に対して統一された方法で反復処理を行なうことができます。配列でも文字列でも、for...of という同じ構文でループを回せるのは、この仕組みがあるからです。
まとめ
'~ is not iterable'
というエラーは、プログラムが「このデータは繰り返し処理できない」と伝えているサインです。
つまり、反復処理(for...ofループなど)が可能なオブジェクトをイテラブルと呼び、その反復処理を実際に担当するイテレーターという仕組みが内部に備わっています。
- イテラブル:ループできる「箱」そのもの(例:配列、文字列)
- イテレーター:箱の中身を1つずつ取り出すための「道具」
for...of ループは、まずイテラブルという箱からイテレーターという道具を取り出し、その道具を使って中身を順番に引っ張り出しています。
このシンプルな仕組みのおかげで、データ構造(配列や連結リストなど)が何であれ、同じ構文で簡単にループを回せるという恩恵を受けています。
最後までお読みいただき、ありがとうございました。
参考URL
Discussion