Rust 如何在处理程序之间传递变量

Rust 如何在处理程序之间传递变量,rust,iron,Rust,Iron,我想要一个在所有处理程序中都可用的上下文结构,但我无法通过编译器获得它 举个例子,我想要这样的东西 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

我想要一个在所有处理程序中都可用的上下文结构,但我无法通过编译器获得它

举个例子,我想要这样的东西

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")))
}
外部板条箱铁;
外部板条箱路由器;
使用铁:前奏曲::*;
使用路由器::路由器;
使用std::collections::HashMap;
结构上下文{
缓存:HashMap,
}
fn main(){
让mut context=context{cache:HashMap::new(),};
让mut router=router::new();
get(“/”,|请求|索引(请求,上下文));
Iron::new(router).http(“localhost:80”).unwrap();
}
fn索引(quot:&mut请求,上下文:context)->IronResult{
Ok(响应::with((iron::状态::Ok,“索引”))
}
这不会在编译时显示冗长的错误消息

错误:类型不匹配解析`for>::输出==std::result::result`:
预期绑定寿命参数,
发现的混凝土寿命[E0271]
src\main.rs:。。。get(“/”,|请求|索引(请求,上下文));

这里的错误信息几乎是无法理解的(这里有一个解决方法!)

问题是没有推断闭包的类型。我们可以帮助编译器注释
请求的类型

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:8080").unwrap(); // port 80 is privileged
}

fn index(_: &mut Request, context: &Context) -> IronResult<Response> {
    Ok(Response::with((iron::status::Ok, "index")))
}
外部板条箱铁;
外部板条箱路由器;
使用铁:前奏曲::*;
使用路由器::路由器;
使用std::collections::HashMap;
使用std::sync::{Arc,Mutex};
#[派生(克隆,默认)]
结构上下文{
缓存:圆弧,
}
fn main(){
让context=context::default();
让mut router=router::new();
设c=context.clone();
router.get(“/”,move | request:&mut request | index(request,&c),“index”);
Iron::new(router).http(“localhost:8080”).unwrap();//端口80具有特权
}
fn索引(quot:&mut请求,上下文:&context)->IronResult{
Ok(响应::with((iron::状态::Ok,“索引”))
}
注意,我将
context
的类型更改为
&context
(否则,闭包将只
fn一次
),并使用
move
(闭包必须具有
静态
生命周期才能实现)


要在
索引中更改
缓存
,您必须将类型设置为
或类似类型。

非常感谢。现在,我没有在我的原始问题中说明这一点,但我有不止一个路由器。get-line(这是使用路由器的意义)和添加第二行(router.get(“/hi”,move |…| hi(…));)将导致新的编译器错误。错误:捕获移动的值:
上下文
再次感谢。这里有很多我不明白的地方(为什么我需要克隆所有东西,当结构的内容相同时,为什么我需要“移动”我的闭包,这甚至意味着什么,为什么这些派生在我的结构上)。我读了rust programming book/doc的东西,现在才意识到我真的不明白他们在那里写了什么。你也可以使用板条箱来共享数据,而不是将其包装在一个弧形和互斥体中。如果你遇到这个错误,请将端口80更改为3000:thread'main'panicked at'called
Result::unwrap()
在一个
Err
value:Io(错误{repr:Os{code:13,消息:“权限被拒绝”}}),src/libcore/result.rs:906:4@malbarbo你能编辑到端口3000吗?这样就少一些人会犯这个愚蠢的小错误了?:)