这是一个与火箭箱相关的非常具体的问题。我不确定这是板条箱的问题还是我只是做了一些明显错误的事情。我在生命周期和宏方面不是最好的。
\n我正在尝试设置 SSE 连接,并且希望宏借用传递到函数中的值。
\n我最初按照他们的教程设置 SSE,并编写了以下代码......
\n#[get("/my/stream")]\npub fn my_stream(config: &State<config::Config>, _pool: &State<Pool<Sqlite>>) -> EventStream![] {\n EventStream! {\n let mut id = 0;\n let mut interval = time::interval(Duration::from_secs(1));\n loop {\n yield Event::data("test data").event("test").id(id.to_string());\n interval.tick().await;\n id += 1;\n }\n } \n}\nRun Code Online (Sandbox Code Playgroud)\n这编译并工作得很好,但是当我尝试做一些简单的事情并借用 config 或 _pool 时,它会抱怨宏中的生命周期。编译器非常清晰,并且与他们文档中的内容相匹配。所以我将生命周期添加到返回值中。
\n#[get("/my/stream")]\npub fn my_stream(config: & State<config::Config>, _pool: &State<Pool<Sqlite>>) -> EventStream![Event + '_] {\n EventStream! {\n let _test = config.database.clone();\n let mut id = 0;\n let mut interval = time::interval(Duration::from_secs(1));\n loop {\n yield Event::data("test data").event("test").id(id.to_string());\n interval.tick().await;\n id += 1;\n }\n } \n}\nRun Code Online (Sandbox Code Playgroud)\n然而,一旦我这样做,它就会抱怨事件不是一个特征......?我浏览了他们的来源,我不认为事件是一种特征。我做错了什么以及为什么?我收到的最后一个错误是...
\n pub fn my_stream(config: & State<config::Config>, _pool: &State<Pool<Sqlite>>) -> EventStream![Event + '_] {\n | ^^^^^ not a trait\n |\nhelp: `+` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way\n --> src/api/mod.rs:24:104\nRun Code Online (Sandbox Code Playgroud)\nThis is the output of cargo tree --depth 1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 clap v2.27.1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 rocket v0.5.0-rc.1\n\xe2\x94\x82 [build-dependencies]\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 serde v1.0.130\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 serde_json v1.0.66\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sqlx v0.5.9\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tokio v1.9.0\nRun Code Online (Sandbox Code Playgroud)\n