Saya telah melihat pertanyaan ini tetapi masih tidak memahami perbedaan antara sifat Iterable dan Traversable. Bisakah seseorang menjelaskan?
scala
scala-collections
Rahul
sumber
sumber
Traversable
di Scala 2.13 (ini masih disimpan sebagai alias yang tidak digunakan lagiIterable
hingga 2.14)Jawaban:
Sederhananya, iterator mempertahankan status, tidak dapat dilintasi.
Sebuah
Traversable
memiliki satu metode abstrak:foreach
. Saat Anda memanggilforeach
, collection akan memberi makan fungsi yang diteruskan semua elemen yang disimpannya, satu demi satu.Di sisi lain, metode
Iterable
has as abstrakiterator
, yang mengembalikanIterator
. Anda dapat memanggilnext
padaIterator
untuk mendapatkan elemen berikutnya pada waktu yang Anda pilih. Sampai Anda melakukannya, itu harus melacak di mana itu dalam koleksi, dan apa selanjutnya.sumber
Iterable
meluasTraversable
, jadi saya rasa maksud AndaTraversable
s yang bukanIterable
s.Traversable
antarmuka tidak memerlukan status penyimpanan, sementara mematuhiIterator
antarmuka memerlukannya .Traversable
s yangIterable
tidak menyimpan status iterasi apa pun. ItuIterator
dibuat dan dikembalikan olehIterable
yang menjaga negara.Anggap saja sebagai perbedaan antara meniup dan menghisap.
Ketika Anda memiliki panggilan
Traversable
sforeach
, atau metode turunannya, itu akan meledakkan nilainya ke dalam fungsi Anda satu per satu - sehingga ia memiliki kendali atas iterasi.Dengan pengembalian
Iterator
olehIterable
meskipun, Anda menyedot nilai darinya, mengontrol kapan harus pindah ke yang berikutnya sendiri.sumber
tl; dr
Iterables
adalahTraversables
yang dapat menghasilkan statefulIterators
Pertama, ketahuilah bahwa itu
Iterable
adalah inti dariTraversable
.Kedua,
Traversable
membutuhkan penerapanforeach
metode, yang digunakan oleh yang lainnya.Iterable
membutuhkan penerapaniterator
metode, yang digunakan oleh yang lainnya.Misalnya, implementasi
find
forTraversable
useforeach
(melalui pemahaman for) dan melontarkanBreakControl
pengecualian untuk menghentikan iterasi setelah elemen yang memuaskan ditemukan.Sebaliknya,
Iterable
kurangi menimpa implementasi ini dan panggilanfind
padaIterator
, yang hanya berhenti iterasi sekali unsur ini ditemukan:Akan lebih baik untuk tidak membuang pengecualian untuk
Traversable
iterasi, tetapi itulah satu-satunya cara untuk mengulang sebagian saat menggunakan justforeach
.Dari satu perspektif,
Iterable
adalah sifat yang lebih menuntut / kuat, karena Anda dapat dengan mudah menerapkanforeach
menggunakaniterator
, tetapi Anda tidak dapat benar-benar menerapkaniterator
menggunakanforeach
.Singkatnya,
Iterable
menyediakan cara untuk menjeda, melanjutkan, atau menghentikan iterasi melalui statefulIterator
. DenganTraversable
, itu semua atau tidak sama sekali (tanpa pengecualian untuk kontrol aliran).Seringkali tidak masalah, dan Anda pasti menginginkan antarmuka yang lebih umum. Tetapi jika Anda membutuhkan lebih banyak kontrol yang disesuaikan atas iterasi, Anda akan memerlukan
Iterator
, yang dapat Anda ambil dari fileIterable
.sumber
Jawaban Daniel kedengarannya bagus. Biarkan saya melihat apakah saya bisa menjelaskannya dengan kata-kata saya sendiri.
Jadi Iterable dapat memberi Anda iterator, yang memungkinkan Anda melintasi elemen satu per satu (menggunakan next ()), dan berhenti dan pergi sesuka Anda. Untuk melakukan itu, iterator perlu menyimpan "penunjuk" internal ke posisi elemen. Namun Traversable memberi Anda metode, foreach, untuk melintasi semua elemen sekaligus tanpa henti.
Sesuatu seperti Range (1, 10) hanya perlu memiliki 2 integer sebagai status Traversable. Tapi Range (1, 10) sebagai Iterable memberi Anda iterator yang perlu menggunakan 3 integer untuk state, salah satunya adalah index.
Mempertimbangkan bahwa Traversable juga menawarkan foldLeft, foldRight, foreachnya perlu melintasi elemen dalam urutan yang diketahui dan tetap. Oleh karena itu, mungkin untuk mengimplementasikan iterator untuk Traversable. Misalnya def iterator = toList.iterator
sumber