当您从临时的可窥视迭代器借用时会发生什么?

时间:2018-11-25 14:34:50

标签: rust

这段代码从stdin读取一行,我想分割它。

use std::io::stdin;

fn example() {
    let mut input = String::new();
    stdin().read_line(&mut input).expect("Failed to read line");
    let mut parts = input.trim().split_whitespace();
    let args = parts;
    let new_dir = args.peekable().peek().unwrap();
    println!("{}", new_dir);
}

编译器说:

error[E0597]: borrowed value does not live long enough
  --> src/lib.rs:8:19
   |
8  |     let new_dir = args.peekable().peek().unwrap();
   |                   ^^^^^^^^^^^^^^^                - temporary value dropped here while still borrowed
   |                   |
   |                   temporary value does not live long enough
9  |     println!("{}", new_dir);
10 | }
   | - temporary value needs to live until here
   |
   = note: consider using a `let` binding to increase its lifetime

我了解这意味着args.peekable()创建了一个临时值,而println!("{}", new_dir);借用了该值。

我不知道临时值在哪里。我以为借来的值是从args借来的,这里不会删除。

args.peekable().peek().unwrap();中到底发生了什么?

1 个答案:

答案 0 :(得分:1)

  

我不知道临时值在哪里

这是args.peekable()的结果,因为编译器会在错误消息中突出显示。 peekable返回Peekable。然后,代码调用peek,它返回对迭代器内部内容的引用:

pub fn peek(&mut self) -> Option<&<I as Iterator>::Item>

要解决此问题,请按照编译器的建议进行操作:

  

考虑使用let绑定来延长其寿命

let mut x = args.peekable();
let new_dir = x.peek().unwrap();