为什么 Rust 不能自动给出参数中的最短生命周期?

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

从 Rust 编程语言书,我到达了生命周期的章节。我不明白为什么 Rust 编译器很难自动为函数参数提供所传递参数的最短生命周期。

例子:

fn main() {
    let string1 = String::from("abcd");
    let string2 = "xyz";

    let result = longest(string1.as_str(), string2);
    println!("The longest string is {}", result);
}

fn longest(x: &str, y: &str) -> &str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

Rust 会抱怨生命周期注释,我将不得不写下以下内容:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {...}

这将导致给出最短的寿命。如果 Rust 可以自动知道最短生命周期并将其分配给

'a
那么我为什么要手动注释函数签名?

换句话说,为什么 Rust 编译器不通过查看传递的参数

string1
string2
来选择最短的生命周期,并将最短的生命周期分配给
'a

附言我假设您将始终拥有相等的生命周期(如本示例)或一个生命周期缩进另一个生命周期,在这种情况下,您会希望最短的生命周期避免悬空引用。

rust lifetime
1个回答
0
投票

我也在学rust,刚看了lifetimes那一章,欢迎指正。

我也有和你一样的问题。为什么不取最短寿命呢?但是再看看这个例子。

fn main() {
    let x = 1;
    let a;
    {
        let y = 2;
        a = something(&x, &y);
    }
    println!("{a}");
}

fn something<'a>(q: &'a i32, w: &'_ i32) -> &'a i32 {
    println!("{w}");
    return q;
}

在这方面我并不真正关心

y
的生命周期。就我而言,我只需要
y
来做一些临时工作(比如打印)。我真正关心的是
x
。因为我要退货了。

如果编译器在我的函数中为

'a
假定相同的生命周期(
w
),代码将不会编译,因为我在删除
a
后使用返回值
y

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