2016-08-25 8 views
3

私はRustを学び、ハイパーの上に構築されたマイクロルートシステムを構築しようとしました(これは単なる学習目的であり、フレームワークが存在することを知っています)。`for <'r, 'r, 'r> ...`スレッド間で安全に送信することはできません

"複雑な"タイプをhyper::server::Handlerと共有する方法がわかりません。私はエラーメッセージを読んだが、残念ながら、私はそれを修正する方法を理解していない(ほとんどの時間、錆のコンパイラはただ修正するべきことを言う、今私は理解していない)。ここで

は、(非)上-簡素化私が試したものの一例取り組んでいる:

extern crate hyper; 
use std::sync::Mutex; 

use hyper::*; 

type Route = (method::Method, String, Box<Fn(server::Request, server::Response)>); 

struct MyHandler { 
    routes: Mutex<Vec<Route>> 
} 

impl server::Handler for MyHandler { 
    fn handle(&self, req: server::Request, mut res: server::Response) { 
     // This is not important 
    } 
} 

fn main() { 
    // This is not important 
} 

とエラーは次のようになります。

error: the trait bound `for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static: std::marker::Send` is not satisfied [--explain E0277] 
    --> src/main.rs:12:10 
    |> 
12 |>  impl server::Handler for MyHandler { 
    |>   ^^^^^^^^^^^^^^^ 
note: `for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static` cannot be sent between threads safely 
note: required because it appears within the type `Box<for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static>` 
note: required because it appears within the type `(hyper::method::Method, std::string::String, Box<for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static>)` 
note: required because of the requirements on the impl of `std::marker::Send` for `std::ptr::Unique<(hyper::method::Method, std::string::String, Box<for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static>)>` 
note: required because it appears within the type `alloc::raw_vec::RawVec<(hyper::method::Method, std::string::String, Box<for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static>)>` 
note: required because it appears within the type `std::vec::Vec<(hyper::method::Method, std::string::String, Box<for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static>)>` 
note: required because of the requirements on the impl of `std::marker::Send` for `std::sync::Mutex<std::vec::Vec<(hyper::method::Method, std::string::String, Box<for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static>)>>` 
note: required because it appears within the type `MyHandler` 
note: required by `hyper::server::Handler` 

私は単純な整数を使用する場合、それは動作しますが、 Routeタイプではありません。

したがって、「スレッド間で安全に送信できない」という特性や問題があります。 Read hyper doc、私はMutexを追加しましたが、私はばかでなければなりません私は何をしているのか分かりません、私はちょうど錆を学ぶのを止めるべきか、

答えて

5

あなたはほぼそこにいます。

エラーがMyHandlerが型が他のスレッドに安全に送ることができることを意味し、Send形質を実装していないことを言っている:

note: required because of the requirements on the impl of `std::marker::Send` for `std::sync::Mutex<std::vec::Vec<(hyper::method::Method, std::string::String, Box<for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static>)>>` 
note: required because it appears within the type `MyHandler` 
note: required by `hyper::server::Handler` 

エラーが正しい場所にポイントを行いますが、それはですビット圧倒的。最初の行は次のとおりです。FnタイプはSendを実装していないことを言っている

note: `for<'r, 'r, 'r> std::ops::Fn(hyper::server::Request<'r, 'r>, hyper::server::Response<'r>) + 'static` cannot be sent between threads safely 

。これはあなたのRouteタイプ1である:それはキャプチャした変数のすべてもSendある場合

type Route = (method::Method, String, Box<Fn(server::Request, server::Response)>); 

Fn閉鎖が唯一Sendがあるが、ここでは、渡された任意の閉鎖が適切であるかどうかわかりません。

解決策は単純です:

type Route = (method::Method, String, Box<Fn(server::Request, server::Response)+Send>); 
+0

スーパークリア:SendするFnタイプを制約します。ありがとう! –

関連する問題