它出現在我的代碼中,一個值比它的引用壽命更長,即使兩者都在相同的範圍內創建。我想知道爲什麼,以及如何調整我參考的一生。參考文獻比相同範圍的參考文獻的壽命短?
例1是由編譯器所接受......
let mut rxs: Vec<Receiver<String>> = Vec::new();
let mut txs: Vec<SyncSender<String>> = Vec::new();
for _ in 0..N {
let (tx, rx) = sync_channel(0);
txs.push(tx);
rxs.push(rx);
}
但是例2是不是...
let sel = Select::new();
let mut handles: Vec<Handle<String>> = Vec::new();
let mut txs: Vec<SyncSender<String>> = Vec::new();
for _ in 0..N {
let (tx, rx) = sync_channel(0);
txs.push(tx);
handles.push(sel.handle(&rx));
}
編譯器告訴我,參考&rx
是借來for
循環的最後一行,但是在for
循環的末尾丟掉了並且需要壽命更長,大概是因爲參考是pla採用壽命更長的結構。爲什麼參考文獻的壽命會不同於這個值,如果這個值可以是將移動到第一個例子中的結構中,爲什麼不能像第二個參考文獻那樣?
最後,我想知道爲什麼我不會在例3中遇到同樣的問題,即使引用被借用並傳入一個持續時間超過借用範圍的結構中...
let (txs, rxs): (Vec<SyncSender<String>>, Vec<Receiver<String>>) =
(0..N).map(|_| sync_channel(0)).unzip();
let handles: Vec<Handle<String>> =
rxs.iter().map(|x| sel.handle(&x)).collect();
所以如果我已經產生RXS,TXS,然後再建手柄作爲參考的載體導入RXS,例2將成爲相當於例3 – Miles
是。但是,當你從一個分片中借用一個值時,就會借用整個分片,這使得難以或不可能寫入命令性的,沒有'不安全'的代碼來提取新的分割,並說服編譯器這是好的。迭代器沒有這個問題,因爲它們的構造強迫每個可變的借位在下一個發生之前完成。有關於此的一些很好的信息在這裏:https://doc.rust-lang.org/nomicon/borrow-splitting.html –