为什么在 Rust 中 [有时] 不需要泛型的生命周期说明符?
Why are lifetime specifiers not required [sometimes] in Rust for generics?
我在查看 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,
}
我在查看 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,
}