当函数的参数是两种不同类型的引用时,为什么rust需要生命周期注解?

bvn4nwqk  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(130)

我是新的生 rust ,我正在努力理解/学习借用检查和终身注解。
当函数接受单个引用作为参数时,为什么可以推断生存期?

fn main() {
    let num = 1;
    let num_ref = test(&num);
    println!("{}", num_ref);
}

fn test(num: &i32) -> &i32 {
    num
}

字符串
但当函数有两个不同引用类型的参数时就不是了。

fn main() {
    let num = 1;
    let s = "test";
    let num_ref = test(&num, s);
    println!("{}", num_ref);
}

fn test(num: &i32, s: &str) -> &i32 {
    num
}


借用检查器不应该能够推断返回的生命周期应该与&i32引用相同吗?因为它是该函数中唯一可以返回的参数。或许我错过了什么?

n53p2ov0

n53p2ov01#

或许我错过了什么?
是的。Rust不做 * 生命周期推断 *,相反,它有一个简单得多的lifetime elision过程,只有几个简单的情况,因此具有非常低的成本/收益比,几乎没有陷阱。然而,正如你所注意到的,它确实很早就出现了问题。

ki0zmccv

ki0zmccv2#

事实上,也许我知道为什么了。我想可能会有这样的情况

struct NumberContainer {
    x: i32
}

fn main() {
    let num = 1;
    let container = NumberContainer { x: 4 };
    let num_ref = test(&num, &container);
    println!("{}", num_ref);
}

fn test<'a>(num: &'a i32, container: &'a NumberContainer) -> &'a i32 {
    &container.x
}

字符串
第二种类型可以是包含i32的对象。因此,在这种情况下,可能存在多个可能的&i32参考返回

相关问题