rust - 如何修复 : value may contain references; add `' static` bound to `T`

标签 rust object-lifetime

我又一次遇到了我似乎无法独自解决的终身问题。

我有这个特点

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 实现的为了能够接受轻量级的功能和更重的重量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分支:

https://github.com/floor-org/floor/tree/static

最佳答案

这里的问题是,为了安全地创建一个装箱的特征对象,原始对象不能有任何生命周期参数(除了static),或者对象本身也需要尊重那个生命周期,这通常是不可能的。要修复它:

pub fn add<T: MiddlewareHandler + 'static> (&mut self, handler: T) {
    self.handlers.push(box handler);
}

读起来有点奇怪,但它说“T 需要实现 MiddlewareHandler 并且它不能包含任何没有 static 的引用生命周期”。这仅适用于 static

关于rust - 如何修复 : value may contain references; add `' static` bound to `T` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24375771/

相关文章:

rust - 是否可以在 Rust 中打印以千位分隔符格式化的数字?

rust - 我可以将向量中子向量的项添加到同一向量中的另一个子向量吗?

memory - 克隆迭代器会复制整个底层向量吗?

functional-programming - 如何在闭包中获取多个参数并打印它们?

c++ - C++中依赖类的生命周期?

generics - 使用接受闭包的方法在 Rust 中创建对象安全特征

c++ - 存储字符串文字指针是否安全?

c# - 需要对线程中创建的对象的生命周期进行解释

java - 如何安全、及时地处置Java中稀缺的共享资源?

c# - 获取对象处置/销毁的通知