Rust语言中的&'a是什么?

时间:2017-12-04 19:26:38

标签: rust

我读了here那个

  

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

理解&适用于shared reference,但不理解Rust语言中type'a之间的区别

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

'astruct Person<'a> { }的含义是什么? 我可以使用structstruct Person<'type> { }构建相同的struct Person<T> { }吗?

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

如果想避免使用<'a>

,我该如何重新编码呢?

1 个答案:

答案 0 :(得分:8)

我找到了解释我问题的thisthis以及thisthis

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

fn bar<'a>(...)

函数可以在<>之间具有“通用参数”,其寿命是一种。 <>用于声明生命周期。这表示酒吧有一个生命周期,'a。

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

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

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

在上面的例子中

struct Person<'a> {  }

要求包含<'a>,因为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);
}