我尝试了以下Rust类型别名:
type Name = String;
工作正常。所以我试了一个变种:
type Name = &str;
这失败了:
error[E0106]: missing lifetime specifier
--> src/main.rs:1:17
|
1 | type Name = &str;
| ^ expected lifetime parameter
为什么类型别名需要一个生命周期参数?如何添加它?
答案 0 :(得分:2)
问题是String
拥有其内存,而&str
是对str
的引用。通常,您可以忽略生命周期,但是当引用存储在struct
,enum
或类型别名中时,必须指定所有生命周期。因此,编写别名的正确方法是:
type Name<'a> = &'a str;
生命周期在类型别名的名称后声明,&str
的生命周期指定为'a
。
有时可以在函数中省略类型的生命周期,这就是为什么你可以写&str
。这也适用于其他类型,包括类型别名。这意味着这是有效的:
fn foo(s: &String) -> Name { s.as_str() }
此处省略Name
上的生命周期参数。