【问题标题】:What is &'a in Rust Language [duplicate]Rust 语言中的 &'a 是什么 [重复]
【发布时间】:2018-05-18 08:13:33
【问题描述】:

我读到here

当您需要指定显式生命周期时,共享引用类型被写入&type&'a type

了解&shared reference,但不明白type'a 在Rust 语言中的区别

another location我读到了这段代码:

#[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);
}

struct Person&lt;'a&gt; { } 中的'a 是什么意思? 我可以使用struct Person&lt;'type&gt; { }struct Person&lt;T&gt; { } 构建相同的struct 吗?

name: &amp;'a str是什么意思?

如果想避免使用&lt;'a&gt;,我该如何重新编码

【问题讨论】:

    标签: rust


    【解决方案1】:

    我发现 thisthisthisthis 可以解释我的问题。

    'a 读作“生命周期 a”。从技术上讲,每个引用都有一些与之相关的生命周期,但编译器允许您在常见情况下省略(即省略,参见“Lifetime Elision”)它们。

    fn bar<'a>(...)
    

    函数可以在&lt;&gt;s 之间有“通用参数”,其中生命周期是一种。 &lt;&gt; 用于声明生命周期。这表示 bar 有一个生命周期,'a。

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

    let greeting = "Hello there."; // greeting: &'static str
    

    “你好。”是一个string literal,它的类型是&amp;'static str。字符串文字是静态分配的字符串切片,这意味着它保存在我们编译的程序中,并且在它运行的整个持续时间内都存在。问候绑定是对这个静态分配的字符串的引用。任何期望字符串切片的函数也将接受字符串文字。

    在上面的例子中

    struct Person<'a> {  }
    

    需要包含 &lt;'a&gt;,因为 name 使用以下方式定义:

    name: &'a str,
    

    调用者:

    let name = "Peter";
    

    如果有兴趣避免使用'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);
    }
    

    正如@DimitrisSfounis 在 cmets 中提到的那样,简而言之,“为什么会有'a?” ---- 因为 struct 定义将它与引用的对象联系起来(在这种情况下,每个 struct Person 实例都引用一个 &str),所以您需要明确声明一个任意的生命周期并将这两件事联系在一起:您希望 struct Person 实例仅在其引用对象(因此 Person 和 name: &'a str)的时间内存活,因此避免了在彼此死亡后的悬空引用。

    【讨论】:

    • 感谢您的详细简明解释。
    • 嗨,我发现你的回答对于像我这样的 Rust 新手来说不够简单。看了半天,我想对这个问题做一个更简单的解释:“为什么'a在那里?” ---- 因为结构定义将它与引用的对象联系起来(在这种情况下,每个struct Person 实例都引用&amp;str)你想明确声明一个任意的生命周期并将这两件事联系在一起:你想要一个@ 987654347@ 实例只与它的引用对象一样长(因此Person&lt;'a&gt;name: &amp;'a str)因此避免了在彼此死亡后悬空引用。
    • 谢谢@DimitrisSfounis 我将您的陈述添加到答案中,希望它对其他人有所帮助:)
    • @DimitrisSfounis 感谢新手 lvl 的回答哈哈。这个新手当然很欣赏它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多