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