fn expensive_sum(v: Vec<i32>) -> i32 {
    fun_name(v)
        .filter(|&x| x % 2 == 0)
        .map(|&x| x*x)
        .sum()
}

fn fun_name(v: Vec<i32>) -> std::slice::Iter<'_, i32> {
    v.iter()
}

使用https://depth-first.com/articles/2020/06/22/returning-rust-iterators/作为参考,询问编译器获得的迭代器的返回类型为std::slice::Iter<'_, i32>,但在编译时:

error[E0106]: missing lifetime specifier
  --> src/main.rs:25:46
   |
25 | fn fun_name(v: Vec<i32>) -> std::slice::Iter<'_, i32> {
   |                                              ^^ expected named lifetime parameter
   |
   = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
help: consider using the `'static` lifetime
   |
25 | fn fun_name(v: Vec<i32>) -> std::slice::Iter<'static, i32> {
   |   

那是什么意思?为什么我要考虑使用static岁的生命周期 ?

推荐答案

fn fun_name(v: Vec<i32>) -> std::slice::Iter<'_, i32> {
    v.iter()
}

此函数的问题与此函数的问题相同

fn foo(x: i32) -> &'what_lifetime_goes_here i32 {
    &x
}

fun_name取得v的所有权,然后try 返回从函数体borrow 的内容.这是不可能的.您通过使用匿名生存期'_来try cheat编译器,但Ruust仍然必须弄清楚这个生存期到底是什么.您的函数在任何生存期内都不是泛型的,所以rustc计算出这里唯一有意义的生存期是'static.然而,这不会解决您的实际问题,因为您不能借v'static,因为它将在函数结束时被删除.

你有两个 Select .你可以获得v的所有权,就像fun_name已经做的那样,但之后你必须返回拥有vec数据std::vec::IntoIter的迭代器,结果是i32.

fn fun_name(v: Vec<i32>) -> std::vec::IntoIter<i32> {
    v.into_iter()
}

或者另一方面,你可以让fun_name借入v,然后你可以返回一个内部切片的迭代器,它的生命周期是v借入的生命周期.

fn fun_name(v: &Vec<i32>) -> std::slice::Iter<'_, i32> {
    v.iter()
}

Rust相关问答推荐

什么样的 struct 可以避免使用RefCell?

为什么要在WASM库中查看Rust函数需要`#[no_mangle]`?

如何对字符串引用的引用向量进行排序,而不是对最外层的引用进行排序?

使用铁 rust S还原对多个数组执行顺序kronecker积

字段类型为Boxed的 struct 的生存期必须超过static

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

Cargo.toml:如何有条件地启用依赖项功能?

使用 Option 来分配?

Rust LinkedList 中的borrow 判断器错误的原因是什么?

Nom 解析器无法消耗无效输入

如何在 Rust 中打印 let-else 语句中的错误?

.to_owned()、.clone() 和取消引用 (*) 之间有区别吗?

当锁被释放时,将锁包装到作用域中是否会发生变化?

在发布中包含 Rust DLL

为什么 Rust 的临时值有时有参考性有时没有?

为什么不能在 Rust 中声明静态或常量 std::path::Path 对象?

在 RefCell 上borrow

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

如何从 many0 传播 Nom 失败上下文?