第二生命周期省略规则

问题描述 投票:0回答:1

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 lifetime borrow-checker
1个回答
0
投票

有趣的是,Rust 参考文献似乎表明您的案例应该得到支持。关于终身省略的文章说:

如果参数中仅使用了一个生命周期(是否已省略),则该生命周期将分配给所有已省略的输出生命周期。

然而,Rustonomicon 的措辞略有不同。关于 lifetime elision 的文章说(强调我的):

如果恰好有一个输入生命周期位置(是否已省略),则该生命周期将分配给所有已省略的输出生命周期。

参数中使用了一个生命周期,

'a
,但有两个生命周期位置,每个
&str
各一个。所以看来这个经济学更准确地描述了省略的规则。

© www.soinside.com 2019 - 2024. All rights reserved.