为什么Rust中的泛型不需要[有时]生存期说明符



我在看Microsoft Rust指南时,在阅读泛型章节时,遇到了以下问题。

考虑以下两段代码:

struct Point<T>
{
x: T,
y: T,
}
fn main()
{
let intro = Point{ x: "Hello", y: "World" };    
}
struct Point
{
x: &str,
y: &str,
}
fn main()
{
let intro = Point{ x: "Hello", y: "World" };    
}

x和y都具有类型&str。为什么编译器能够在第一部分推断寿命,而不能在第二部分推断寿命?

在第一种情况下:

struct Point<T>
{
x: T,
y: T,
}
fn main()
{
let intro = Point{ x: "Hello", y: "World" };    
}

类型定义对于任何T都是有效的,尤其是对于存在引用的引用所具有的任何生存期。这是一个泛型,它是为了适应(并在必要时产生几个不同的"真实"结构(。

您使用的具体结构是T&'static str,但它可能是另一个生存期。

在第二种情况下,

struct Point
{
x: &str,
y: &str,
}
fn main()
{
let intro = Point{ x: "Hello", y: "World" };    
}

没有通用的。所以它必须是一个完全定义的类型。这意味着如果有参考资料,就必须有一辈子。您没有指定生存期,所以这是一个错误。

如果你只想有一生的自由决定,那么它又是一个通用的:

struct Point<'a> {
x: &'a str,
y: &'a str,
}
fn main()
{
let intro = Point{ x: "Hello", y: "World" };    
}

或者,如果您希望您的Point仅对静态引用有效,您可以将其定义为

struct Point {
x: &'static str,
y: &'static str,
}

最新更新