考虑下面的例子
struct Foo {
val: &str
}
fn main() {
let hello = String::from("hello");
let foo = Foo{ val: &hello[..]};
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为需要生命周期。一个非常简单的修复如下:
struct Foo<'a> {
val: &'a str
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器不能假设(作为合理的默认值)引用的寿命与 struct 一样长Foo?是否有任何用例不会出现这种情况?
因为假设引用只要存在就会存在,这显然struct Foo是错误的。例如考虑这个。
fn main() {
let foo: Foo;
{
let string = "foo".to_string();
foo = Foo {
val: string.as_str(),
}
}
println!("{}", foo.val);
}
Run Code Online (Sandbox Code Playgroud)
如果编译器在这里假设了“合理的默认值”,并且它的string存在时间与 一样长Foo,那么这将编译 。但我们可以清楚地看到,string在内循环结束后它将被丢弃,但foo即使在内循环结束后仍将存在。
简而言之,它的Foo生命周期取决于 ,&str而不是相反,即Foo不能超过&str。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |