跟進這個在此處標記為重復的問題。
for loop 如何實作的概念into_iter一直困擾著我,這個答案給我帶來了更多的問題,比如re-borrow的條款,除了一個地方之外,rust 官方檔案中根本沒有提到。
據我對此評論的理解,當 vec 是可變參考時,for i in vec.into_iter()實際上是for i in (&mut *vec).into_iter()在幕后。
怎么樣for i in vec,真的i in vec.into_iter()嗎?是否有任何地方更詳細地說明了 for 回圈是如何實作的,以及如何觸發重新借用以及它是如何作業的?
參考代碼:
fn question1_1(vec: &mut [i32]) {
for &mut item in vec.into_iter() {
println!("{}", item);
}
for &mut item in vec { // --- `vec` moved due to this implicit call to `.into_iter()`
println!("{}", item);
}
vec; // Error: move occurs because `vec` has type `&mut [i32]`, which does not implement the `Copy` trait
}
pub fn main() {
let mut s = vec![1, 2, 3];
question1_1(&mut s);
uj5u.com熱心網友回復:
for回圈被脫糖(這可以通過檢查 HIR 看到):
{
let _t = match IntoIterator::into_iter(iter) {
mut iter => loop {
match Iterator::next(&mut iter) {
None => break,
Some(i) => {
// Body
}
}
},
};
_t
}
具體來說,通過執行將可迭代物件轉換為迭代器IntoIterator::into_iter(iterable)。每個特征,包括IntoIterator,都有一個隱藏的Self泛型引數,所以這實際上是IntoIterator::<_>::into_iter(iterable)。從重新借用 POV,這類似于:
fn foo<T>(v: T) {}
foo::<_>(iterable)
確切的細節在Do mutable references have move semantics? ,但一般的想法是,它沒有記錄。而當前的作業方式是,當編譯器無法在沒有推斷的情況下確定某物是可變參考時,它不會被重新借用。由于_需要推理,因此不會重新借用。
接收器以不同的方式作業(總是重新借用),因此iterable.into_iter()確實會執行重新借用。事實上,這種行為與自動參考有關,而不是重新借用。另請參閱Rust 的確切自動取消參考規則是什么?.
uj5u.com熱心網友回復:
除了在操場上使用 HIR 來檢查 for 回圈如何在幕后運行,這里是關于如何為回圈脫糖的官方檔案。
從檔案給出的示例中,值(vec 型別)被傳遞到 IntoIterator::into_iter() IntoIterator::into_iter(values),這與作為方法呼叫不同values.into_iter()。
let values = vec![1, 2, 3, 4, 5];
for x in values {
println!("{}", x);
}
脫糖成
let values = vec![1, 2, 3, 4, 5];
{
let result = match IntoIterator::into_iter(values) {
mut iter => loop {
let next;
match iter.next() {
Some(val) => next = val,
None => break,
};
let x = next;
let () = { println!("{}", x); };
},
};
result
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/476184.html
下一篇:WSL安裝及配置圖形界面
