В моем коде видно, что значение живет дольше, чем ссылка на него, хотя оба они созданы в одной области. Я хотел бы знать, почему и как я могу изменить время жизни моей ссылки.
Пример 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
и должна прожить дольше, предположительно потому что ссылка помещается в структуру с более длительным сроком службы. Почему у ссылки будет другое время жизни, чем у значения, и если значение можно переместить в структуру, как в первом примере, почему бы не у ссылки, как во втором?
Наконец, я хотел бы знать, почему я не сталкиваюсь с той же проблемой в примере 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();