Rust 终身错误我不知道';我不知道如何解决这个问题

Rust 终身错误我不知道';我不知道如何解决这个问题,rust,Rust,嗨,我在一个相当简单的测试用例中遇到了生命周期问题 我似乎不明白编译器在告诉我什么。 下面的代码粘贴到Rust Played中 关于代码的想法是将元素串在一起形成一个管道。数据最终将从一个元素传递到下一个元素。每一级都有一个(rx,tx)对,在该对上接收前一级的输入,并将数据发送到下一级。我可以将元素标记为Sync,因为一次只有一个元素将处理数据的一部分 错误是: 错误[E0495]:由于需求冲突,无法推断适当的生存期 --> :56:18 | 56 |对于自我元素中的e{ |

嗨,我在一个相当简单的测试用例中遇到了生命周期问题 我似乎不明白编译器在告诉我什么。 下面的代码粘贴到Rust Played中

关于代码的想法是将
元素
串在一起形成一个管道。数据最终将从一个元素传递到下一个元素。每一级都有一个
(rx,tx)
对,在该对上接收前一级的输入,并将数据发送到下一级。我可以将
元素
标记为
Sync
,因为一次只有一个
元素
将处理数据的一部分

错误是:

错误[E0495]:由于需求冲突,无法推断适当的生存期
--> :56:18
|
56 |对于自我元素中的e{
|                  ^^^^^^^^^^^^^
|
注:首先,寿命不能超过53:53时身体上定义的寿命“a”。。。
--> :53:54
|
53 | pub fn run(和self)->Vec{
|                                                      ^
注意:…因此表达式是可赋值的(预期为std::vec::vec,发现为std::vec::vec)
--> :56:18
|
56 |对于自我元素中的e{
|                  ^^^^^^^^^^^^^
=注意:但是,生存期必须对静态生存期有效。。。
注意:……这样类型“[closure@:62:41:64:15 e:Box,sender:std::sync::Arc,receiver:std::sync::Arc]”将满足其所需的生存期限制
--> :62:27
|
62 |句柄。推(线程::繁殖(移动| |){
|                           ^^^^^^^^^^^^^
我被as
元素
s混淆的第一个错误定义为
&'a元素
,那么他们是否应该告诉编译器他们会继续使用 对于同一管道

我猜第二个错误是告诉我,Vec取决于生命周期,但我不知道如何表达

我希望在我纠正前两个之后,第三个会更有意义。目前我只是不知道它告诉我什么

use std::sync::{Arc, Mutex};
use std::thread;
use std::result::Result;
use std::sync::mpsc::{SyncSender, Receiver, sync_channel};

pub trait Element: Send + Sync {
    fn run(&self, output: Arc<Mutex<SyncSender<i32>>>,
                   input: Arc<Mutex<Receiver<i32>>>);
}

pub struct TestElement {}

impl TestElement {
    pub fn new() -> Self {
        TestElement {}
    }
}

impl Element for TestElement {
    fn run(&self, output: Arc<Mutex<SyncSender<i32>>>,
                   input: Arc<Mutex<Receiver<i32>>>) {
        println!("Hello");
    }
}

pub struct Pipeline<'a> {
    elements: Vec<Box<&'a Element>>,
}

impl<'a> Pipeline<'a> {
    pub fn new(name: String) -> Self {
        Pipeline {
            elements: Vec::new(),
        }
    }

    pub fn run(&self) -> Vec<thread::JoinHandle<()>> {
        let mut handles = Vec::with_capacity(self.elements.len());

        for e in self.elements {
             let channel = sync_channel::<i32>(1000);
             let sender = Arc::new(Mutex::new(channel.0)).clone();
             let receiver = Arc::new(Mutex::new(channel.1)).clone();

             handles.push(thread::spawn(move || {
                 e.run(sender, receiver);
             }));
        }

        handles
    }
}

fn main() {
    let mut test_element = TestElement::new();
    let mut pipeline = Pipeline::new("example pipeline".to_string());

    let handles = pipeline.run();
}
使用std::sync::{Arc,Mutex};
使用std::线程;
使用std::result::result;
使用std::sync::mpsc:{SyncSender,Receiver,sync_channel};
发布特性元素:发送+同步{
fn运行和自运行,输出:Arc,
输入:Arc);
}
发布结构TestElement{}
简单测试元素{
pub fn new()->Self{
测试元素{}
}
}
TestElement的impl元素{
fn运行和自运行,输出:Arc,
输入:Arc){
println!(“你好”);
}
}
发布结构管道>,
}
恳求{
pub fn new(名称:String)->Self{
管道{
元素:Vec::new(),
}
}
发布fn运行(&self)->Vec{
让mut handles=Vec::with_capacity(self.elements.len());
对于自我元素中的e{
let channel=sync_channel::(1000);
让sender=Arc::new(Mutex::new(channel.0)).clone();
让receiver=Arc::new(Mutex::new(channel.1)).clone();
handles.push(线程::spawn(移动| |){
e、 运行(发送方、接收方);
}));
}
处理
}
}
fn main(){
让mut test_element=TestElement::new();
让mut pipeline=pipeline::new(“示例pipeline.to_string());
让handles=pipeline.run();
}

编译器报告的每个
注释
都会为前面的错误或警告添加上下文。这不是一个单独的错误;修复错误会使注释消失


现在,不幸的是,错误信息并不十分清楚。问题是您正在尝试移动
e
,它属于
box类型。您可以进一步简化您的代码吗?它仍然是一大块代码,当我们只处理一小段代码时,它更容易回答,更容易理解。谢谢:)我试着减小一点大小。我可以减少更多,但这会消除一些错误,我不确定我是否应该这样做,因为我不知道它们是单独的错误还是与一个修复程序有关。你怎么看?为什么要使用
Box我在这里使用Box,因为我不知道元素的大小,因为这是一个特性。最后感谢我使用了crossbeam。多个错误让我困惑。遗憾的是,他们无法将crossbeam重新引入标准库。他们当然可以在标准库中引入
crossbeam
,但将新功能开发为外部库有几个优点。这给了作者更多的灵活性在早期修改API,并为他们提供更多的受众,因为标准库中引入的新功能首先是不稳定的,这意味着只有那些每晚使用编译器的人才能使用它们。