如何修复缺少的生命周期说明符?

时间:2017-04-10 18:40:11

标签: rust lifetime

我有一个非常简单的方法。第一个参数接受向量组件(" A",5,0),我将它与另一个向量的每个元素进行比较,看它们是否有相同的(_,5,_),然后打印出来找到的元素字符串。

比较(" A",5,0)和(" Q",5,2)应打印出Q.

fn is_same_space(x: &str, y1: i32, p: i32, vector: &Vec<(&str, i32, i32)>) -> (&str) {
    let mut foundString = "";

    for i in 0..vector.len() {

        if y1 == vector[i].1 {
            foundString = vector[i].0;
        }

    }
    foundString    
}

但是,我收到此错误

error[E0106]: missing lifetime specifier
 --> src/main.rs:1:80
  |
1 | fn is_same_space(x: &str, y1: i32, p: i32, vector: &Vec<(&str, i32, i32)>) -> (&str) {
  |                                                                                ^ expected lifetime parameter
  |
  = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or one of `vector`'s 2 elided lifetimes

2 个答案:

答案 0 :(得分:6)

通过指定生命周期

fn is_same_space<'a>(x: &'a str, y1: i32, p: i32, vector: &'a Vec<(&'a str, i32, i32)>) -> (&'a str)

这只是对你可能对函数做什么的许多可能的解释之一,因此它是一个非常保守的选择 - 它使用所有引用参数的统一生命周期。

也许您想要返回一个字符串,其长度与xvector一样长,或者只要vector内的字符串;所有这些都可能有效。

强烈建议您返回并重新阅读The Rust Programming Language。它是免费的,针对Rust的初学者,它涵盖了使Rust独特的所有东西,对程序员来说是新手。许多人已经花了很多时间在这本书上,它回答了许多初学者问题,比如这个。

具体来说,您应该阅读以下章节:

甚至还有一个second edition in the works,章节如下:

为了好玩,我会使用迭代器重写你的代码:

fn is_same_space<'a>(y1: i32, vector: &[(&'a str, i32, i32)]) -> &'a str {
    vector.iter()
        .rev() // start from the end
        .filter(|item| item.1 == y1) // element that matches
        .map(|item| item.0) // first element of the tuple
        .next() // take the first (from the end)
        .unwrap_or("") // Use a default value
}

答案 1 :(得分:2)

所以问题来自于vector有两个推断的生命周期,一个用于vector本身(&Vec部分),另一个用于向量内的&str 。您在x上也有一个推断的生命周期,但这确实无关紧要。

要修复它,只需指定返回的&str与向量中的&str一样长。

fn is_same_space<'a>(                        // Must declare the lifetime here
    x: &str,                                 // This borrow doesn't have to be related (x isn't even used)
    y1: i32,                                 // Not borrowed
    p: i32,                                  // Not borrowed or used
    vector: &'a Vec<(&'a str, i32, i32)>     // Vector and some of its data are borrowed here
) -> &'a str {                               // This tells rustc how long the return value should live
    ...
}