防止Rc <trait>中的“静态寿命要求”

时间:2018-08-03 11:03:05

标签: static rust traits lifetime

'static中使用trait类型时,std::rc::Rc生命周期要求从何而来?我该如何避免?例如。尝试编译此代码时

trait Handler{}

fn add(a: std::rc::Rc<Handler>) {
}

fn main() {
    add(0);
}

生锈报告

error[E0308]: mismatched types
 --> test.rs:7:9
...
  = note: expected type `std::rc::Rc<Handler + 'static>`
             found type `{integer}`

注意:错误本身是预期的;我只对Handler + 'static诊断输出感兴趣。 Real程序创建trait类型的实例,将其存储到HashMap中,并在其上运行类型特定的函数。无法编译

| - borrowed value only lives until here
|
= note: borrowed value must be valid for the static lifetime...

在这个地方。

第二个例子

以下代码更加真实,并且可以更好地演示该问题:

trait Handler {
}

struct SomeHandler<'a>(&'a u32);

impl <'a> SomeHandler<'a> {
    fn new(a: &'a u32) -> std::rc::Rc<Handler> {
        std::rc::Rc::new(SomeHandler(a))
    }
}

impl <'a> Handler for SomeHandler<'a> {
}

fn main() {
    let a: u32;
    SomeHandler::new(&a);
}

失败并

8 |         std::rc::Rc::new(SomeHandler(a))
  |                                      ^
  = note: but, the lifetime must be valid for the static lifetime...
  = note: ...so that the expression is assignable:
          expected std::rc::Rc<Handler + 'static>
             found std::rc::Rc<Handler>

为什么明确的生命周期无效

可以通过添加显式生存期(例如Rc<Handler + 'a>)来修复简单的演示。不幸的是,这不是一个选择(也不尝试做任何事情'static),因为实际代码的意图是

struct PollRegistry {
    ...
    handlers: std::collections::HashMap<mio::Token, std::rc::Weak<PollHandler>>,
}

impl PollRegistry {
    fn register<'a>(&mut self, handler: &std::rc::Rc<PollHandler>,
                interest: mio::Ready, opts: mio::PollOpt)
                -> std::io::Result<()> {
        ....
        self.handlers.insert(token, std::rc::Rc::downgrade(handler));
    }
}

PollHandler专长中的方法创建并拥有其他PollHandler专长,这些专长通过这些方法在注册表中注册。

rustc 1.27.1

0 个答案:

没有答案