Rust 含多态结构的动态性状向量机中的模糊错误

Rust 含多态结构的动态性状向量机中的模糊错误,rust,Rust,rust的错误消息让我有点困惑。 考虑下面的代码(在这个上下文中没有什么意义;FO的返回类型可以很容易地改变为 VEC(和自我)> VEC(和自我)> VEC>=VEC::新(); 因为我在0..10{ 让foo=Box::new(self.clone()); foos.push(foo); } 福斯 } } 此代码的问题在于MyStruct中的类型参数T可以由'a延长。编译此代码时,我收到的错误消息是 error[E0309]: the parameter type `T` may not

rust的错误消息让我有点困惑。 考虑下面的代码(在这个上下文中没有什么意义;FO的返回类型可以很容易地改变为<代码> VEC(和自我)> VEC(和自我)> VEC>=VEC::新(); 因为我在0..10{ 让foo=Box::new(self.clone()); foos.push(foo); } 福斯 } } 此代码的问题在于
MyStruct
中的类型参数
T
可以由
'a
延长。编译此代码时,我收到的错误消息是

error[E0309]: the parameter type `T` may not live long enough
  --> src/main.rs:20:23
   |
14 | impl <T: Clone> MyTrait for MyStruct<T> {
   |       -- help: consider adding an explicit lifetime bound...: `T: 'a +`
...
20 |             foos.push(foo);
   |                       ^^^ ...so that the type `MyStruct<T>` will meet its required lifetime bounds
error[E0309]:参数类型'T'的有效期可能不够长
-->src/main.rs:20:23
|
14 |为MyStruct导入MyTrait{
-帮助:考虑添加显式生命周期绑定……:'t':a+'
...
20 | foos.push(foo);
|^^^…以便类型“MyStruct”满足其所需的生存期限制
它声明类型参数
T
可以用
'a
生存期界限进行补充。但是,如果我尝试这样做,编译器声明
'a
是未定义的生存期界限,如果我声明'a',则说明
'a
被隐藏,并且我收到了与上面相同的错误。有什么方法可以修复此错误吗或者我已经达到了生锈的极限

如果您想使用这些代码,这里有一个简单的解决方案,使用最短的生命周期语法 解决这个问题的一个方法是使用
T
上绑定的
静态
,如下所示。这表明
MyStruct
impl
接受任何类型的
T
,其字段(如果有的话)要么只包含所拥有的数据,要么包含具有静态生存期的引用

从您使用绑定在
T
上的
Clone
判断,我感觉您打算让
MyStruct
拥有
T
,而
T
需要被其他对象使用的地方,它将被克隆并随后被其他对象拥有

要获得一个对理解生命周期的细微差别非常有用的讨论,请单击。本文中的一个适用摘录讨论了
和'static T
T:'static
之间的区别:

…具有“静态生存期”的类型不同于受“静态生存期”限制的类型。后者可以在运行时动态分配,可以安全自由地进行变异,可以删除,并且可以在任意时间内生存

关于“静态作为特征边界”的另一个适用参考来自:

作为特征绑定,它意味着该类型不包含任何非静态引用。例如,接收者可以保持该类型,只要他们愿意,它永远不会失效,直到他们放弃它

pub trait MyTrait{
fn get_vec(&self)->vec;
}
#[衍生(克隆)]
发布结构MyStruct{
类型参数:T,
}
使用最短生存期语法的简单解决方案
解决这个问题的一个方法是使用
T
上绑定的
静态
,如下所示。这表明
MyStruct
impl
接受任何类型的
T
,其字段(如果有的话)要么只包含所拥有的数据,要么包含具有静态生存期的引用

从您使用绑定在
T
上的
Clone
判断,我感觉您打算让
MyStruct
拥有
T
,而
T
需要被其他对象使用的地方,它将被克隆并随后被其他对象拥有

要获得一个对理解生命周期的细微差别非常有用的讨论,请单击。本文中的一个适用摘录讨论了
和'static T
T:'static
之间的区别:

…具有“静态生存期”的类型不同于受“静态生存期”限制的类型。后者可以在运行时动态分配,可以安全自由地进行变异,可以删除,并且可以在任意时间内生存

关于“静态作为特征边界”的另一个适用参考来自:

作为特征绑定,它意味着该类型不包含任何非静态引用。例如,接收者可以保持该类型,只要他们愿意,它永远不会失效,直到他们放弃它

pub trait MyTrait{
fn get_vec(&self)->vec;
}
#[衍生(克隆)]
发布结构MyStruct{
类型参数:T,
}

implfoo的声明实际上没有意义:

fn foo<'a>(&self) -> Vec<Box<dyn MyTrait + 'a>>;

或者通过在生命周期内使整个特征通用:

trait MyTrait<'a> {
    fn foo(&self) -> Vec<Box<dyn MyTrait + 'a>>;
}

#[derive(Clone)]
struct MyStruct<T> {
    type_parameter: T,
}

impl <'a, T: Clone + 'a> MyTrait<'a> for MyStruct<T> {
    fn foo(&self) -> Vec<Box<dyn MyTrait + 'a>> {
        let mut foos: Vec<Box<dyn MyTrait + 'a>> = Vec::new();
        
        for i in 0..10 {
            let foo = Box::new(self.clone());
            foos.push(foo);
        }
        
        foos
    }
}
trait MyTrait>;
}
#[衍生(克隆)]
结构MyStruct{
类型参数:T,
}
impl MyTrait>{

让mut foos:Vec声明
foo
实际上没有意义:

fn foo<'a>(&self) -> Vec<Box<dyn MyTrait + 'a>>;

或者通过在生命周期内使整个特征通用:

trait MyTrait<'a> {
    fn foo(&self) -> Vec<Box<dyn MyTrait + 'a>>;
}

#[derive(Clone)]
struct MyStruct<T> {
    type_parameter: T,
}

impl <'a, T: Clone + 'a> MyTrait<'a> for MyStruct<T> {
    fn foo(&self) -> Vec<Box<dyn MyTrait + 'a>> {
        let mut foos: Vec<Box<dyn MyTrait + 'a>> = Vec::new();
        
        for i in 0..10 {
            let foo = Box::new(self.clone());
            foos.push(foo);
        }
        
        foos
    }
}
trait MyTrait>;
}
#[衍生(克隆)]
结构MyStruct{
类型参数:T,
}
impl MyTrait>{

让mut foos:vec感谢您的回答。正如还没有完全掌握生命周期(如果还不明显的话)一样。我使用
foo()
函数来获取原始结构的突变。在获得这些突变后,原始结构可以(必须)被删除,因为我做了许多突变和突变的突变,我不想把它们留在记忆中。我想象使用
fn foo vec我不确定我是否理解你所说的“获取原始结构的突变”在
fn-foo-VecOTOH中,如果
foo
应该消费
self
,因为它被其他东西取代,那么原型应该反映这一点:
fn-foo(self)->Vec
(没有生存期和引用).
foo
返回一个克隆值的vec,如果我只使用克隆值,为什么原始结构需要保持活动状态?因为你的函数原型就是这么说的;)听起来对你来说正确的原型是
fn foo(&self)->Vec
但您需要指定
T:'static
,以确保克隆的值