Почему пример многопоточного веб-сервера из книги Rust не компилируется? - PullRequest
0 голосов
/ 12 ноября 2018

Это пример кода из книги :

use std::{
    sync::{mpsc, Arc, Mutex},
    thread,
};

struct Worker {
    id: usize,
    thread: thread::JoinHandle<()>,
}

impl Worker {
    fn new(
        id: usize,
        receiver: Arc<Mutex<mpsc::Receiver<Box<dyn FnOnce() + Send + 'static>>>>,
    ) -> Worker {
        let thread = thread::spawn(move || loop {
            let job = receiver.lock().unwrap().recv().unwrap();

            println!("Worker {} got a job; executing.", id);

            (*job)();
        });

        Worker { id, thread }
    }
}

площадка

Не компилируется:

error[E0161]: cannot move a value of type dyn std::ops::FnOnce() + std::marker::Send: the size of dyn std::ops::FnOnce() + std::marker::Send cannot be statically determined
  --> src/lib.rs:21:13
   |
21 |             (*job)();
   |             ^^^^^^

Это ошибка в книге или я что-то упустил?

1 Ответ

0 голосов
/ 12 ноября 2018

Похоже, что вы имеете в виду раздел книги, за которым сразу следует текст:

Теоретически этот код должен компилироваться. К сожалению, Руст Компилятор еще не совершенен, и мы получаем эту ошибку:

error[E0161]: cannot move a value of type std::ops::FnOnce() +
std::marker::Send: the size of std::ops::FnOnce() + std::marker::Send cannot be
statically determined
  --> src/lib.rs:63:17
   |
63 |                 (*job)();
   |                 ^^^^^^

Таким образом, нет, это не ошибка в книге; они сознательно включили это, чтобы показать проблему. Пожалуйста, продолжайте читать главу, чтобы увидеть, как они предлагают ее решить.

Смотри также:

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