Rust 为什么可以在函数上指定多个泛型生存期?

Rust 为什么可以在函数上指定多个泛型生存期?,rust,lifetime,Rust,Lifetime,当您创建一个以多个引用作为输入的函数,并将引用作为输出返回时,您需要指定输出引用的生存期与哪一个或多个输入引用相关联。这是有道理的 没有意义的是,为什么需要定义多个通用生命周期。您只能有一个返回值 这里,我们定义了'a和'b——两个通用生命周期。在返回值上,我们可以指定'a或'b——但不能同时指定两者: fn foo(参考文献1:&'a str,参考文献2:&'b str)->&'a str{} 这似乎可以缩短为: fn foo&'a str{} 如果我们想将输出的生存期与第二个输入参数联系

当您创建一个以多个引用作为输入的函数,并将引用作为输出返回时,您需要指定输出引用的生存期与哪一个或多个输入引用相关联。这是有道理的


没有意义的是,为什么需要定义多个通用生命周期。您只能有一个返回值

这里,我们定义了
'a
'b
——两个通用生命周期。在返回值上,我们可以指定
'a
'b
——但不能同时指定两者:

fn foo(参考文献1:&'a str,参考文献2:&'b str)->&'a str{}
这似乎可以缩短为:

fn foo&'a str{}
如果我们想将输出的生存期与第二个输入参数联系起来,我们可以:

fn foo&'a str{}
如果我们想将两者结合起来,我们可以:


fn foo如果返回值中只有一个生存期,则函数上不需要多个生存期参数。您询问的所有这些示例都是有效的防锈代码:

fn foo<'a, 'b>(ref1: &'a str, ref2: &'b str) -> &'a str {} // borrows ref1 ('b is unnecessary)
fn foo<'a>(ref1: &'a str, ref2: &str) -> &'a str {}        // borrows ref1 (same as above)
fn foo<'a>(ref1: &str, ref2: &'a str) -> &'a str {}        // borrows ref2
fn foo<'a>(ref1: &'a str, ref2: &'a str) -> &'a str {}     // borrows both ref1 and ref2
fn-foo(参考文献1:&'a-str,参考文献2:&'b-str)->&'a-str{}//借用参考文献1('b是不必要的)
fn foo&'a str{}//借用参考文献1(同上)
fn foo&'a str{}//借用参考文献2
fn foo(arg1:&'a str,arg2:&'a str,arg3:&'b str)->(&'a str,&'b str){
(最长(arg1,最长(arg2,arg3)),arg3)
}
这个相当愚蠢的函数返回一个包含两个引用的元组:一个引用3个字符串中最长的一个,另一个总是引用
arg3
。第一个引用的生存期必须超过所有三个参数;第二个引用只需在
arg3
中过期

相关问题
  • (以及与此相关的其他问题)

“您只能有一个返回值。”那么
->(&str,&str)
呢?或者类型为
&mut&T
的参数(用于通过函数内部的赋值返回值)?“上面的示例似乎可以缩短为:“@trentcl我不确定,但我无法想象可能有一个元组,其中一个引用过期,而另一个仍然有效。如果元组中的任何一个引用都无效,那么整个元组不是无效的吗?@Shepmaster您可以有一个具有多个生命周期的单一类型(元组)?每个元素一个?我写了一个答案,但我不完全确定我是否回答了这个问题,因此如果这个(以及相关问题)不能解决您的问题,请尽可能澄清。谢谢既然您已经链接到,我将指出,如果您接受这些答案,那么您首先几乎需要有一个函数来构造这些类型。
fn longest_last<'a, 'b: 'a>(arg1: &'a str, arg2: &'a str, arg3: &'b str) -> (&'a str, &'b str) {
    (longest(arg1, longest(arg2, arg3)), arg3)
}