我在看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,
}