Rust语言中的&'a是什么

Has*_*sef 6 rust

我读到这里

编写了共享引用类型&type,或者&'a type在您需要指定显式生存期时。

理解&是为了shared reference但不了解Rust语言type和之间有什么区别'a

另一个位置,我读了这段代码:

#[derive(Debug)]
struct Person<'a> {
    name: &'a str,
    age: u8
}

fn main() {
    let name = "Peter";
    let age = 27;
    let peter = Person { name, age };

    // Pretty print
    println!("{:#?}", peter);
}
Run Code Online (Sandbox Code Playgroud)

是什么'astruct Person<'a> { }手段?我可以struct使用struct Person<'type> { }或构建相同的内容struct Person<T> { }吗?

那是什么意思name: &'a str呢?

如果不想使用该代码,该如何重新编码 <'a>

Has*_*sef 12

我发现了这个这个这个这个,这解释了我的问题。

'a写着“寿命”。从技术上讲,每个引用都有与之关联的生命周期,但是在常见情况下,编译器允许您忽略(即忽略,请参见“ 生命周期消除 ”)。

fn bar<'a>(...)
Run Code Online (Sandbox Code Playgroud)

函数可以在<>s 之间具有“通用参数” ,其中的寿命是一种。该<>用于声明寿命。这表示酒吧有一个终身,'a。

Rust有两种主要类型的字符串:&strString。在&str被称为‘string slices’。字符串切片具有固定的大小,不能进行突变。它是对UTF-8字节序列的引用。

let greeting = "Hello there."; // greeting: &'static str
Run Code Online (Sandbox Code Playgroud)

“你好。” 是a string literal,类型为&'static str。字符串文字是静态分配的字符串切片,这意味着它已保存在我们的已编译程序中,并且在其运行的整个过程中都存在。问候语绑定是对此静态分配的字符串的引用。任何需要字符串切片的函数都将接受字符串文字。

在上面的例子中

struct Person<'a> {  }
Run Code Online (Sandbox Code Playgroud)

要求包含<'a>,其name定义如下:

name: &'a str,
Run Code Online (Sandbox Code Playgroud)

称为:

let name = "Peter";
Run Code Online (Sandbox Code Playgroud)

如果有兴趣避免使用,'a则可以将以上代码重写为:

#[derive(Debug)]
struct Person {    // instead of: struct Person<'a> {
    name: String,  // instead of: name: &'a str 
    age: u8
}

fn main() {
    let name = String::from("Peter");  // instead of: let name = "Peter"; which is &'static str
    let age = 27;
    let peter = Person { name, age };

    // Pretty print
    println!("{:#?}", peter);
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您详细简洁的解释。 (3认同)
  • 你好,我发现你的答案对于像我这样的 Rust 新手来说不够简单。环顾了一段时间后,我想对这个问题提供一个更简单的解释:“为什么会有‘a’?” ---- 因为结构定义将其绑定到一个引用的对象(在这种情况下,每个“struct Person”实例都引用一个“&amp;str”),所以您想要专门声明一个任意生命周期并将这两个东西绑定在一起:您想要一个`struct Person` 实例**仅与其引用的对象一样长**(因此是 `Person&lt;'a&gt;` 和 `name: &amp;'a str`),因此避免了彼此死亡后的悬空引用。 (3认同)
  • 谢谢@DimitrisSfounis,我将您的陈述添加到答案中,希望它对其他人有帮助:) (2认同)