編者按:本代碼示例來自1.0版之前的Rust版本,並且不具有語法上有效的Rust 1.0代碼。此代碼的更新版本會產生不同的錯誤,但答案仍然包含有價值的信息。借用的向量引用的生命期與它所包含的借來的指針之間的關係是什麼?
我嘗試這個代碼在鏽0.6:
fn test<'r>(xs: &'r [&str]) -> &'r str {
return xs[0];
}
我認爲這種類型的簽名是指:「測試需要借來指針,具有壽命「R,以借指向字符串的載體,和借來的指針返回一個字符串,也終身「R但是編譯器說:
refs.rs:2:8: 2:12 error: mismatched types: expected `&'r str` but found `&str` (lifetime mismatch)
refs.rs:2 return xs[0];
^~~~
refs.rs:1:39: 3:1 note: the lifetime &'r as defined on the block at 1:39...
refs.rs:1 fn test<'r>(xs: &'r [&str]) -> &'r str {
refs.rs:2 return xs[0];
refs.rs:3 }
refs.rs:1:39: 3:1 note: ...does not necessarily outlive the anonymous lifetime #1 defined on the block at 1:39
refs.rs:1 fn test<'r>(xs: &'r [&str]) -> &'r str {
refs.rs:2 return xs[0];
refs.rs:3 }
error: aborting due to previous error
這似乎暗示了載體內的指針可能不會生活,只要在(只讀)載體本身這可能嗎?
有一些額外的註釋我需要告訴編譯器這是確定?
同樣地,何談資指針的載體?例如
fn test<'r>(xs: &'r [~str]) -> &'r str {
return xs[0];
}
同樣,我希望能借用一個指向矢量元素的指針,至少只要借用了整個列表。
對於背景下,我原來的問題試圖與擁有指針列表延長借點的列表:
fn extend<'r>(xs: ~[&'r str], ys: &'r [~str]) -> ~[&'r str]
的計劃是:建立與所有借來的指針的exended列表,使用它,然後釋放擴展列表,然後釋放擁有指針的原始列表,包括所包含的字符串。
好的,但爲什麼這是一件無效的事情呢?這個向量怎麼能超過它內部的引用? –
@ThomasLeonard在你的情況下,向量包含指向字符串的指針。如果這些不是唯一的指針,那麼這些字符串可以很容易地超過矢量。 –
@RamonSnir我怎麼能表達與此相反的?我想說,生成的指針至少和提供的矢量一樣長(但可能更長)。 –