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

时间:2016-05-25 06:22:11

标签: rust lifetime lifetime-scoping

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

上述代码比使用两个生命周期有什么优势?是否有上述代码可以使用的情况,但2个生命周期不会?

2 个答案:

答案 0 :(得分: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
    }
}

这里输出的生命周期可能取决于两个参数的生命周期,我们不知道在编译时哪一个。因此,我们必须为最坏的情况做好准备并做到这一点。

答案 1 :(得分:1)

在生命周期相同的情况下,您可以从xy借用返回值,因此从功能体的角度来看,它更灵活。 来自调用者的限制性更大,因为xy只要保留结果就必须有效,而不仅仅是x(比如说​​)。