Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 特质类型与寿命问题_Rust_Lifetime - Fatal编程技术网

Rust 特质类型与寿命问题

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

我正在尝试编写Iron插件中间件,但在尝试定义
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