编者注:此代码示例来自 Rust 1.0 之前的版本,在语法上不是有效的 Rust 1.0 代码。此代码的更新版本会产生不同的错误,但答案仍然包含有价值的信息。
我在 Rust 0.6 中尝试了这段代码:
fn test<'r>(xs: &'r [&str]) -> &'r str {
return xs[0];
}
我认为这种类型签名的意思是:“test 需要一个借用的指针,其生命周期为 '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]
计划是:创建一个包含所有借用指针的扩展列表,使用它,然后释放扩展列表,然后释放拥有指针的原始列表,包括包含的字符串。