fn say() -> &str {
"this is str"
}
// consider using the `'static` lifetime: `&'static `
但下面就可以
struct Cat {}
impl Cat {
fn hi(&self) -> &str {
"hi"
}
}
fn say() -> &str {
"this is str"
}
// consider using the `'static` lifetime: `&'static `
但下面就可以
struct Cat {}
impl Cat {
fn hi(&self) -> &str {
"hi"
}
}
编译器会通过一些规则进行自动添加生命周期标注:
- 所有引用类型的参数都有独立的生命周期
- 如果只有一个引用类型,它的生命周期会赋给所有的输出
- 如果有多个引用类型的参数,其实一个是self,那么它的生命周期会赋值给所有输出
你的第一个例子不满足规则,所有需要显式的生命周期标注;而第二个例子,满足规则3,所以不用进行显式标注
7 回答5.3k 阅读
1 回答3.4k 阅读
2 回答821 阅读
1 回答862 阅读
Rust 原本对所有引用都需要显式写明 lifetime ,后来逐渐加入了一些自动推断的规则,可以在某些地方省略 lifetime 标注。
第二个写法就是可以省略情况,因为有一个
&self
参数。补全就是这样的:fn hi<'a>(&'a self) -> &'a str {
第一个写法现在无法自动推断,就需要自己写了。
life time elision