The Rust book 提供了以下代码来说明需要显式生命周期的有效函数定义:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
在该部分的后面,作者介绍了生命周期省略的规则。生命周期省略的第二条规则指出
如果只有一个输入生命周期参数,则该生命周期将分配给所有输出生命周期参数。
根据这个规则,下面的函数定义也应该是有效的:
fn longest<'a>(x: &'a str, y: &'a str) -> &str { // No explicit return lifetime
// snip
}
由于
longest
只有一个输入生命周期参数,因此输出生命周期参数应推断为 'a
。但这段代码无法编译。借用检查器提供以下帮助消息:
help: this function's return type contains a borrowed value with an elided lifetime, but the lifetime cannot be derived from the arguments.
这是什么意思?为什么在这种情况下不能使用推断的生命周期?
有趣的是,Rust 参考文献似乎表明您的案例应该得到支持。关于终身省略的文章说:
如果参数中仅使用了一个生命周期(是否已省略),则该生命周期将分配给所有已省略的输出生命周期。
然而,Rustonomicon 的措辞略有不同。关于 lifetime elision 的文章说(强调我的):
如果只有一个输入生命周期位置(是否已省略),则该生命周期将分配给所有已省略的输出生命周期。
参数中使用了一个生命周期,
'a
,但有两个生命周期位置,每个&str
各一个。所以看来这个经济学更准确地描述了省略的规则。