Rust 特质类型与寿命问题
我正在尝试编写Iron插件中间件,但在尝试定义Rust 特质类型与寿命问题,rust,lifetime,Rust,Lifetime,我正在尝试编写Iron插件中间件,但在尝试定义typemap键时遇到了一个问题: 简单类型的最小示例不会出现问题: pub结构数据库; 数据库的impl密钥{ 类型值=isize; } 但一旦涉及生命周期,我就无法编译库: pub结构数据库{ 类型值=数据库的PooledConnection键; src/lib.rs:35} src/lib.rs:33:1:35:2注意:…这样特质类型参数就与impl上指定的参数匹配(预期为'typemap::Key',找到'typemap::Key`) sr
typemap
键时遇到了一个问题:
简单类型的最小示例不会出现问题:
pub结构数据库;
数据库的impl密钥{
类型值=isize;
}
但一旦涉及生命周期,我就无法编译库:
pub结构数据库{
类型值=数据库的PooledConnection键;
src/lib.rs:35}
src/lib.rs:33:1:35:2注意:…这样特质类型参数就与impl上指定的参数匹配(预期为'typemap::Key',找到'typemap::Key`)
src/lib.rs:33 impl{
src/lib.rs:34 type Value=PooledConnection`将满足其所需的生存期限制
src/lib.rs:33 impl{
src/lib.rs:34 type Value=PooledConnection下面是键的定义:
pub trait Key: Any {
type Value: Any;
}
也就是说,它扩展了:
pub trait Any:'static+Reflect{
fn获取类型id(&self)->TypeId;
}
这意味着实现键
的任何类型也必须实现任何
,并且任何值
关联的类型实例化也必须实现任何
。但是,任何
仅定义为静态
的类型,即不包含非静态引用的类型
使用生存期参数参数化的类型,如数据库
,通常包含这样的引用(实际上,您的类型包含&'a
字段),因此它们不是静态的
,因此它们不能实现任何。因此这些类型不能实现键。事实上,这就是您的错误所在,即使这并不明显:
note: but, the lifetime must be valid for the static lifetime...
无论如何,这个错误的核心原因是Rust目前不支持对非静态类型使用Any
进行反射-据我所知,这里存在一些关于生命周期的可靠性问题。因此,目前您唯一的选择是重构程序,这样您就不需要在t中存储非静态类型ypeMap