我一直在努力获取与Iron一起使用的持久性参考,不确定如何设置适当的寿命。我希望能够在不同的路线上重复使用控制器。
示例:
use iron::prelude::*;
use iron::typemap::Key;
use persistent::Read;
use router::Router;
pub struct Controller;
pub struct Rest {
controller: Controller,
}
impl Key for &Controller {
type Value = Self;
}
impl Rest {
pub fn run(&self) {
let router = Router::new();
let mut chain = Chain::new(router);
chain.link(Read::<&Controller>::both(&self.controller));
Iron::new(chain).http(format!("0.0.0.0:1234")).ok();
}
}
fn main() {
Rest {
controller: Controller,
}
.run();
}
[dependencies]
iron = "0.6.*"
router = "0.6.*"
persistent = "0.4.0"
error[E0478]: lifetime bound not satisfied
--> src/main.rs:12:6
|
12 | impl Key for &Controller {
| ^^^
|
note: lifetime parameter instantiated with the lifetime '_ as defined on the impl at 12:14
--> src/main.rs:12:14
|
12 | impl Key for &Controller {
| ^
= note: but lifetime parameter must outlive the static lifetime
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'_` due to conflicting requirements
--> src/main.rs:12:6
|
12 | impl Key for &Controller {
| ^^^
|
note: first, the lifetime cannot outlive the lifetime '_ as defined on the impl at 12:14...
--> src/main.rs:12:14
|
12 | impl Key for &Controller {
| ^
= note: ...so that the types are compatible:
expected typemap::Key
found typemap::Key
= note: but, the lifetime must be valid for the static lifetime...
note: ...so that the type `&Controller` will meet its required lifetime bounds
--> src/main.rs:12:6
|
12 | impl Key for &Controller {
| ^^^
答案 0 :(得分:1)
错误消息指出:
但是有效期参数必须超过静态有效期
这是因为Key
使用Any
作为超级特征,这需要'static
:
pub trait Any: 'static {
fn type_id(&self) -> TypeId;
}
最简单的解决方案是为一个值实现Key
,然后将该值提供给Read::both
:
impl Key for Controller {
type Value = Self;
}
impl Rest {
pub fn run(self) {
let router = Router::new();
let mut chain = Chain::new(router);
chain.link(Read::<Controller>::both(self.controller));
Iron::new(chain).http(format!("0.0.0.0:1234")).ok();
}
}
我希望在所有这些路由中全局共享持久数据
在那种情况下,我会完全避免使用永久性板条箱,而只是创建一个单例:
答案 1 :(得分:-1)
您需要为impl
块添加一个明确的生命周期绑定。否则,编译器不了解控制器参考的参考有效性。
这应该有效,尽管我尚未测试
pub struct Rest {
controller: controller::Controller,
}
impl<'a> Key for &'a controller::Controller {
type Value = Self;
}
impl Rest {
pub fn run(&self) {
let mut router = Router::new();
let mut chain = Chain::new(router);
chain.link(Read::<&controller::Controller>::both(&self.controller));
Iron::new(chain).http(format!("0.0.0.0:1234"))
}
}
另一方面,我认为您不需要在Read
调用中指定类型,编译器应该能够从上下文中确定它。