3 回答

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊
第一個(gè)問(wèn)題是:“什么是into_iter?”
into_iter來(lái)自IntoIterator特征:
pub trait IntoIterator
where
<Self::IntoIter as Iterator>::Item == Self::Item,
{
type Item;
type IntoIter: Iterator;
fn into_iter(self) -> Self::IntoIter;
}
當(dāng)您要指定如何將特定類型轉(zhuǎn)換為迭代器時(shí),可以實(shí)現(xiàn)此特征。最值得注意的是,如果類型實(shí)現(xiàn)IntoIterator,則可以在for循環(huán)中使用它。
例如,Vec實(shí)施IntoIterator……三次!
impl<T> IntoIterator for Vec<T>
impl<'a, T> IntoIterator for &'a Vec<T>
impl<'a, T> IntoIterator for &'a mut Vec<T>
每個(gè)變體都略有不同。
這個(gè)消耗,Vec并且它的迭代器產(chǎn)生值(T直接):
impl<T> IntoIterator for Vec<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(mut self) -> IntoIter<T> { /* ... */ }
}
另外兩個(gè)通過(guò)引用獲取向量(在兩種情況下都不要被into_iter(self)因?yàn)閟elf是引用的簽名所欺騙),并且它們的迭代器將生成對(duì)內(nèi)部元素的引用Vec。
這產(chǎn)生了不可變的參考:
impl<'a, T> IntoIterator for &'a Vec<T> {
type Item = &'a T;
type IntoIter = slice::Iter<'a, T>;
fn into_iter(self) -> slice::Iter<'a, T> { /* ... */ }
}
雖然這產(chǎn)生了可變的參考:
impl<'a, T> IntoIterator for &'a mut Vec<T> {
type Item = &'a mut T;
type IntoIter = slice::IterMut<'a, T>;
fn into_iter(self) -> slice::IterMut<'a, T> { /* ... */ }
}
所以:
iter和之間有什么區(qū)別into_iter?
into_iter是獲取迭代器的通用方法,無(wú)論該迭代器產(chǎn)生值,不可變引用還是可變引用都是上下文相關(guān)的,有時(shí)可能令人驚訝。
iter并且iter_mut是臨時(shí)方法。這可以解決上下文相關(guān)位,并且按照慣例,您可以獲取一個(gè)迭代器,該迭代器將產(chǎn)生引用。
Rust by Example帖子的作者舉例說(shuō)明了對(duì)依賴于所into_iter調(diào)用的上下文(即類型)的依賴而產(chǎn)生的驚奇,并且還通過(guò)使用以下事實(shí)使問(wèn)題更加復(fù)雜:
IntoIterator未針對(duì)[T; N],僅針對(duì)&[T; N]和實(shí)現(xiàn)&mut [T; N]
如果沒(méi)有為值實(shí)現(xiàn)方法,則會(huì)自動(dòng)搜索該值的引用
這是非常令人驚訝的,into_iter因?yàn)樗蓄愋停ǔ鈁T; N])都為所有3個(gè)變體(值和引用)實(shí)現(xiàn)了它。數(shù)組不可能實(shí)現(xiàn)產(chǎn)生值的迭代器,因?yàn)樗荒堋翱s小”以放棄其項(xiàng)。
關(guān)于數(shù)組為何實(shí)現(xiàn)IntoIterator(以一種令人驚訝的方式):使得有可能在循環(huán)中遍歷對(duì)它們的引用for。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
.into_iter()不是針對(duì)數(shù)組本身實(shí)現(xiàn)的,而僅針對(duì)&[]。相比:
impl<'a, T> IntoIterator for &'a [T]
type Item = &'a T
與
impl<T> IntoIterator for Vec<T>
type Item = T
由于IntoIterator僅在上定義&[T],因此切片本身無(wú)法像Vec使用值那樣被丟棄。(值不能移出)
現(xiàn)在,為什么是這樣,這是一個(gè)不同的問(wèn)題,我想學(xué)習(xí)一下自己。推測(cè):數(shù)組是數(shù)據(jù)本身,切片只是對(duì)其的視圖。實(shí)際上,您不能將數(shù)組作為值移動(dòng)到另一個(gè)函數(shù)中,只能傳遞它的視圖,因此也不能在那里使用它。
- 3 回答
- 0 關(guān)注
- 1728 瀏覽
添加回答
舉報(bào)