【发布时间】:2014-06-23 22:45:46
【问题描述】:
我又一次遇到了我自己似乎无法解决的终身问题。
我有这个特点
pub trait MiddlewareHandler: Clone {
fn invoke (&self, req: &Request, res: &mut Response) -> bool {
true
}
// we need this because otherwise clone() would be ambiguous
fn clone_box(&self) -> Box<MiddlewareHandler> {
box self.clone() as Box<MiddlewareHandler>
}
}
impl MiddlewareHandler for fn (req: &Request, res: &mut Response) -> bool {
fn invoke(&self, req: &Request, res: &mut Response) -> bool{
(*self).invoke(req, res)
}
}
impl Clone for Box<MiddlewareHandler> {
fn clone(&self) -> Box<MiddlewareHandler> {
self.clone_box()
}
}
我为fn (req: &Request, res: &mut Response) -> bool 实现的目的是为了能够同时使用accept 轻量级函数和更重的MiddlewareHandler 实现者。
我将它们存储为Vec<Box<MiddlewareHandler>>
pub struct Middleware {
handlers: Vec<Box<MiddlewareHandler>>
}
现在,问题是,编译器在这里对我大喊大叫:
pub fn add<T: MiddlewareHandler> (&mut self, handler: T) {
self.handlers.push(box handler);
}
上面写着:
error: value may contain references; add `'static` bound to `T`
self.handlers.push(box handler);
实现应该与这里使用的非常相似:
https://github.com/iron/iron/blob/master/src/chain/stackchain.rs#L67
但是,我似乎看不出区别:-/
如果有人愿意帮助我,我将代码推送到 github 到 static 分支:
【问题讨论】:
标签: rust object-lifetime