第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

iter和into_iter有什么區(qū)別?

iter和into_iter有什么區(qū)別?

Git
慕碼人2483693 2019-11-12 14:02:28
我正在做具有示例代碼片段的Rust by Example教程:// Vec examplelet vec1 = vec![1, 2, 3];let vec2 = vec![4, 5, 6];// `iter()` for vecs yields `&i32`. Destructure to `i32`.println!("2 in vec1: {}", vec1.iter()     .any(|&x| x == 2));// `into_iter()` for vecs yields `i32`. No destructuring required.println!("2 in vec2: {}", vec2.into_iter().any(| x| x == 2));// Array examplelet array1 = [1, 2, 3];let array2 = [4, 5, 6];// `iter()` for arrays yields `&i32`.println!("2 in array1: {}", array1.iter()     .any(|&x| x == 2));// `into_iter()` for arrays unusually yields `&i32`.println!("2 in array2: {}", array2.into_iter().any(|&x| x == 2));我非常困惑-對(duì)于Vec從iteryields引用返回的迭代器和從into_iteryields值返回的迭代器,但是對(duì)于數(shù)組,這些迭代器是相同的嗎?這兩種方法的用例/ API是什么?
查看完整描述

3 回答

?
慕工程0101907

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。


查看完整回答
反對(duì) 回復(fù) 2019-11-12
?
一只甜甜圈

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ù)中,只能傳遞它的視圖,因此也不能在那里使用它。


查看完整回答
反對(duì) 回復(fù) 2019-11-12
  • 3 回答
  • 0 關(guān)注
  • 1728 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)