我读了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);
}
'a
中struct Person<'a> { }
的含义是什么?
我可以使用struct
或struct Person<'type> { }
构建相同的struct Person<T> { }
吗?
name: &'a str
是什么意思?
如果想避免使用<'a>
答案 0 :(得分:8)
我找到了解释我问题的this和this以及this和this。
'a
读取'a life a'。从技术上讲,每个引用都有一些与之相关的生命周期,但编译器允许您在常见情况下忽略它们(即省略,请参阅“Lifetime Elision”)。
fn bar<'a>(...)
函数可以在<>
之间具有“通用参数”,其寿命是一种。 <>
用于声明生命周期。这表示酒吧有一个生命周期,'a。
Rust有两种主要类型的字符串:&str
和String
。 &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);
}