2016-11-25 44 views

回答

1

是的,在這種情況下,技術上Iterator可以應用於List。這通常不正確,因爲迭代器可能需要不在基本容器中的不同狀態(例如,Vec迭代器可能需要將索引存儲到下一個項目纔能有效地迭代)。

其中一個原因是,如果實現在未來發生變化,並且List迭代器對於額外狀態會更好,則可以在不更改任何調用者的情況下更改迭代器結構。

另一個原因是在Rust中,使用類型來縮小接口以減少錯誤的機率是很常見的。如果直接執行Iterator(並且推測IntoIterator返回self),那麼在迭代過程中用戶可能會調用其他List方法,這可能是錯誤的。相反,迭代器是一個單獨的類型,這意味着在迭代過程中不可能有人推送項目。 (請注意,由於借用/移動規則,在for循環中無論如何都很難完成此操作,但總體要點仍然存在)。

+0

謝謝!即使'Iterator'在'List'上實現,我們仍然無法在迭代過程中調用'List'方法,因爲List已經被移動了,還是我弄錯了? – letmutx

+0

這在'for'循環中是正確的,但也可以直接使用迭代器(調用'next')。這不是該原則的最好例子。 –

+2

Iterator特性增加了許多擴展方法,所以這是將它們乾淨地分開的另一個原因。也許有一個'.map()'方法是很棒的,但是一個'last()'並沒有那麼多地佔用整個列表。 – bluss

相關問題