对多个参数使用相同的生存期有什么好处


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

与使用两个生命周期相比,上面的代码有什么优势?是否存在以上代码可以工作,但2个生命周期不能工作的情况?

这实际上取决于您的用例。给定你写的确切代码:

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

这里只使用一个生存期是一个缺点,因为返回值只取决于x参数,而不是y参数。让我们想象一下这个用户代码:

let x_in = "paul".to_owned();
let out = {
let y_in = "peter".to_owned();
xory(&x_in, &y_in)
};

我们希望这能很好地工作,因为out基本上就是x_in。但编译器抱怨道:

<anon>:12:22: 12:26 error: `y_in` does not live long enough
<anon>:12         xory(&x_in, &y_in)
^~~~
<anon>:13:7: 14:2 note: reference must be valid for the block suffix following statement 1 at 13:6...
<anon>:13     };
<anon>:14 }
<anon>:11:39: 13:6 note: ...but borrowed value is only valid for the block suffix following statement 0 at 11:38
<anon>:11         let y_in = "peter".to_owned();
<anon>:12         xory(&x_in, &y_in)
<anon>:13     };

这是因为编译器(根据xory签名)假定xory的输出引用了这两个参数。因此,最好尽可能详细地指定寿命,以避免参数之间不必要的条件/假设/关系。


在某些情况下,您只需要使用一个生存期(或稍有不同的解决方案):假设您想根据某些条件返回xy

fn xory<'a>(x: &'a str, y: &'a str) -> &'a str { 
if x.len() == 42 { 
x
} else {
y
}
}

在这里,输出的生存期可能取决于两个参数的生存期,我们不知道在编译时是哪一个。因此,我们必须做好最坏的打算,并这样做。

在相同的生存期内,返回值可以从xy中借用,因此从函数体的角度来看,它更灵活。对于调用者来说,它的限制性更强,因为只要结果保持不变,xy都需要有效,而不仅仅是x

相关内容

  • 没有找到相关文章

最新更新