在'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