Что происходит, когда вы заимствуете из временного итератора? - PullRequest
0 голосов
/ 25 ноября 2018

Этот код читает строку из 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 голосов
/ 25 ноября 2018

Я не могу понять, где временное значение

Это результат 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...