對於有關代碼組織的原因,我需要編譯器接受以下(簡化)代碼:如何在向量之後創建借用值時向矢量添加引用?
fn f() {
let mut vec = Vec::new();
let a = 0;
vec.push(&a);
let b = 0;
vec.push(&b);
// Use `vec`
}
編譯器會抱怨
error: `a` does not live long enough
--> src/main.rs:8:1
|
4 | vec.push(&a);
| - borrow occurs here
...
8 | }
|^`a` dropped here while still borrowed
|
= note: values in a scope are dropped in the opposite order they are created
error: `b` does not live long enough
--> src/main.rs:8:1
|
6 | vec.push(&b);
| - borrow occurs here
7 | // Use `vec`
8 | }
|^`b` dropped here while still borrowed
|
= note: values in a scope are dropped in the opposite order they are created
不過,我有一個很難說服編譯器在其引用的變量之前刪除該向量。 vec.clear()
不起作用,drop(vec)
也不起作用。 mem::transmute()
也不起作用(強制vec
爲'static
)。
我發現的唯一解決方案是將參考轉換爲&'static _
。有沒有其他方法?甚至有可能在安全的Rust中編譯它?
基本上,計算值,並推動他們都依賴於相同的值相同的情況,但不同的價值觀有不同的條件,使您的第一種情況意味着複製'if'語句。這些值不能移動到矢量中,因爲矢量必須包含對特徵對象的引用。但是你最後的情況正是我所追求的。 – moatPylon