2016-08-12 13 views
3

すべてのハンドラで使用できるコンテキスト構造体を作成したいが、コンパイラを利用できない。例えばハンドラ間で変数を渡すにはどうすればいいですか?

、私はのためのissueがある(これは、エラーメッセージがここにはほとんど理解不能である長いエラーメッセージ

error: type mismatch resolving `for<'r, 'r, 'r> <[[email protected]\main.rs:... context:_] as std::ops::FnOnce<(&'r mut iron::Request<'r, 'r>,)>>::Output == std::result::Result<iron::Response, iron::IronError>`: 
expected bound lifetime parameter , 
    found concrete lifetime [E0271] 
src\main.rs:...  router.get("/", |request| index(request, context)); 

答えて

4

でコンパイルされません

このような
extern crate iron; 
extern crate router; 

use iron::prelude::*; 
use router::Router; 
use std::collections::HashMap; 

struct Context { 
    cache: HashMap<String, String>, 
} 

fn main() { 
    let mut context = Context { cache: HashMap::new(), }; 
    let mut router = Router::new(); 

    router.get("/", |request| index(request, context)); 

    Iron::new(router).http("localhost:80").unwrap(); 
} 


fn index(_: &mut Request, context: Context) -> IronResult<Response> { 
    Ok(Response::with((iron::status::Ok, "index"))) 
} 

何かをしたいですそれ!)。

問題は、クロージャのタイプが推定されていないことです。 (そうでない場合は、閉鎖が唯一implementsFnOnceでしょう)し、使用move(閉鎖が実装する'static寿命を持っている必要があり、私は&Contextcontextの種類を変更し

extern crate iron; 
extern crate router; 

use iron::prelude::*; 
use router::Router; 
use std::collections::HashMap; 
use std::sync::{Arc, Mutex}; 

#[derive(Clone, Default)] 
struct Context { 
    cache: Arc<Mutex<HashMap<String, String>>>, 
} 

fn main() { 
    let context = Context::default(); 
    let mut router = Router::new(); 

    let c = context.clone(); 
    router.get("/", move |request: &mut Request| index(request, &c), "index"); 

    Iron::new(router).http("localhost:80").unwrap(); 
} 

fn index(_: &mut Request, context: &Context) -> IronResult<Response> { 
    Ok(Response::with((iron::status::Ok, "index"))) 
} 

注:私たちは、requestの種類に注釈を付けるコンパイラを助けることができますHandler)。

cacheindexに変更するには、changeのタイプをArc<Mutex<HashMap<String, String>>>またはそれに類するものにする必要があります。

+0

多くのおかげです。今、私はこれを私の元の問題で述べませんでしたが、私はこれらのrouter.get-lines(ルータを使用するポイントです)を2つ以上持っていて、そのような2行目を追加しました(router.get "/ hi" 、move | ... | hi(...));)新しいコンパイラエラーが発生します。エラー:移動した値のキャプチャ: 'context' – Nozdrum

+0

@Nozdrumアップデートを参照してください。 – malbarbo

+0

もう一度これに感謝します。私はここで理解できないことがたくさんあります(構造体の内容が同じになると、なぜ私はすべてをクローンする必要がありますか、なぜ私はクロージャーを移動させる必要がありますか?私の構造体で)。私は錆プログラミングの本/ docの事を読んで、今は彼らがそこに書いたことを本当に理解していないことを理解しています。 – Nozdrum

関連する問題