我找到了this和this,this和this,这就解释了我的问题.
'a
上写着"生命的a".从技术上讲,每个引用都有一些与之相关的生存期,但编译器允许您在常见情况下省略(即省略,请参见"Lifetime Elision").
fn bar<'a>(...)
一个函数可以有<>
之间的"通用参数",其中生命周期是一种.<>
用于声明生命周期.这说明wine 吧只有一次生命.
Rust有两种主要类型的弦:&str
和String
.&str
人被称为‘string slices’
人.字符串切片的大小是固定的,不能进行变异.它是对UTF-8字节序列的引用.
let greeting = "Hello there."; // greeting: &'static str
"你好."是string literal
型,型号是&'static str
.string literal是静态分配的字符串片段,这意味着它保存在编译的程序中,并在整个运行期间存在.问候语绑定是对这个静态分配字符串的引用.任何需要字符串片段的函数也将接受字符串文本.
在上面的例子中
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);
}
正如@Dimitrissfouns在 comments 中提到的,简而言之,"为什么‘a’在那里?"——因为struct定义将其绑定到一个引用的对象(在本例中,每个struct Person实例都引用了a&str),所以您需要具体地声明一个任意生存期,并将这两件事绑定在一起:您希望struct Person实例的生存时间与其引用的对象一样长(因此Person<;a>;和name:&;a str)这样就避免了在对方死后挂起参照物.