我正在查看 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,
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句