1
在Learning Rust With Entirely Too Many Linked Lists的書中,在implementation的IntoIter
中,爲什麼List
包裝在一個元組結構中?相反,Iterator
本來可以用於List
。List爲什麼包裹在IntoIter中?
在Learning Rust With Entirely Too Many Linked Lists的書中,在implementation的IntoIter
中,爲什麼List
包裝在一個元組結構中?相反,Iterator
本來可以用於List
。List爲什麼包裹在IntoIter中?
是的,在這種情況下,技術上Iterator
可以應用於List
。這通常不正確,因爲迭代器可能需要不在基本容器中的不同狀態(例如,Vec
迭代器可能需要將索引存儲到下一個項目纔能有效地迭代)。
其中一個原因是,如果實現在未來發生變化,並且List
迭代器對於額外狀態會更好,則可以在不更改任何調用者的情況下更改迭代器結構。
另一個原因是在Rust中,使用類型來縮小接口以減少錯誤的機率是很常見的。如果直接執行Iterator
(並且推測IntoIterator
返回self
),那麼在迭代過程中用戶可能會調用其他List
方法,這可能是錯誤的。相反,迭代器是一個單獨的類型,這意味着在迭代過程中不可能有人推送項目。 (請注意,由於借用/移動規則,在for
循環中無論如何都很難完成此操作,但總體要點仍然存在)。
謝謝!即使'Iterator'在'List'上實現,我們仍然無法在迭代過程中調用'List'方法,因爲List已經被移動了,還是我弄錯了? – letmutx
這在'for'循環中是正確的,但也可以直接使用迭代器(調用'next')。這不是該原則的最好例子。 –
Iterator特性增加了許多擴展方法,所以這是將它們乾淨地分開的另一個原因。也許有一個'.map()'方法是很棒的,但是一個'last()'並沒有那麼多地佔用整個列表。 – bluss