Как вставить в HashMap разыменованный итератор LinkedList? - PullRequest
0 голосов
/ 26 октября 2019

Как исправить проблему на скриншоте? Я уже пытался сделать его изменчивым, но это не главное. Что это может быть, как от этого избавиться? Буду благодарен за изменения в коде.

screenshot: scr

let mut buf = vec![0 as u8; 4096];
for stream in listener.incoming() {
    match stream {
        Ok(mut stream) => {
            match stream.read(&mut buf) {
                Ok(size) => {
                    //Get List of names
                    let names: LinkedList<String> = serde_json::from_slice(&buf[..size])?;
                    for name in names.iter() {
                        if (*data).available.contains_key(&*name) {
                            //If file already exist just update Vec of IP
                            (*data)
                                .available
                                .get_mut(&*name)
                                .unwrap()
                                .push(stream.peer_addr().unwrap());
                        } else {
                            //In another case - adding file with first IP that share it
                            let mut v: Vec<SocketAddr> = Vec::new();
                            v.push(stream.peer_addr().unwrap());
                            (*data).available.insert(*name, v);
                        }
                    }
                }
                Err(_) => {
                    println!("An error occurred, {}", stream.peer_addr().unwrap());
                }
            }
        }
        Err(e) => {
            println!("Error: {}", e);
        }
    }
}

1 Ответ

2 голосов
/ 26 октября 2019

Прежде всего, вы уверены, что хотите LinkedList, а не Vec в качестве вывода из вашего анализатора JSON? Из ржавых документов LinkedList:

Почти всегда лучше использовать Vec или VecDeque вместо LinkedList

Чтобы решить вашу проблему, вы должны позвонить names.into_iter() вместоnames.iter(). Обратите внимание, что это сделает список непригодным для использования после цикла for. Затем вам придется удалить разыменования в вашем коде, то есть написать &name вместо "&*name" и name вместо *name. Тем не менее, вы вообще не должны были писать &*name, потому что & и * в &*name взаимно отменяют друг друга.

Редактировать: Как было отмечено в комментариях, вызов into_iter ()является избыточным, так как циклы неявно сами вызывают into_iter ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...