Tôi đang đọc "Lập trình trong Scala 2". Trong phần 24.4, nó lưu ý rằng Iterable chứa nhiều phương thức mà không thể được viết một cách hiệu quả mà không có một trình lặp. Bảng 24.2 chứa các phương pháp này. Tuy nhiên, tôi không hiểu tại sao một số người trong số họ không thể được thực hiện hiệu quả trên iterator. Ví dụ, hãy xem xét zipWithIndex.Tại sao zipWithIndex được triển khai trong Iterable và không Traversable?
def zipWithIndex[A1 >: A, That](implicit bf: CanBuildFrom[Repr, (A1, Int), That]): That = {
val b = bf(repr)
var i = 0
for (x <- this) {
b += ((x, i))
i +=1
}
b.result
}
Tại sao không di chuyển định nghĩa này sang đi ngang? Dường như với tôi rằng mã có thể giống hệt nhau và sẽ không có sự khác biệt về hiệu quả.
Chỉ muốn thêm một trường hợp sử dụng cho 'zipWithIndex' trên 'traversable '. Điều gì sẽ xảy ra nếu bạn đang thực hiện một phương thức để chọn một phần tử ngẫu nhiên từ một mạng di chuyển? Khi lặp qua các phần tử, bạn cần một chỉ mục để trợ giúp với các xác suất, mặc dù chỉ mục không tương ứng với một vị trí bền vững với cấu trúc. – schmmd