でコンパイルされません
このような
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
寿命を持っている必要があり、私は&Context
にcontext
の種類を変更し
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
)。
cache
をindex
に変更するには、changeのタイプをArc<Mutex<HashMap<String, String>>>
またはそれに類するものにする必要があります。
多くのおかげです。今、私はこれを私の元の問題で述べませんでしたが、私はこれらのrouter.get-lines(ルータを使用するポイントです)を2つ以上持っていて、そのような2行目を追加しました(router.get "/ hi" 、move | ... | hi(...));)新しいコンパイラエラーが発生します。エラー:移動した値のキャプチャ: 'context' – Nozdrum
@Nozdrumアップデートを参照してください。 – malbarbo
もう一度これに感謝します。私はここで理解できないことがたくさんあります(構造体の内容が同じになると、なぜ私はすべてをクローンする必要がありますか、なぜ私はクロージャーを移動させる必要がありますか?私の構造体で)。私は錆プログラミングの本/ docの事を読んで、今は彼らがそこに書いたことを本当に理解していないことを理解しています。 – Nozdrum