Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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 - Fatal编程技术网

Rust 使用螺纹时自身参数在锈蚀中的寿命

Rust 使用螺纹时自身参数在锈蚀中的寿命,rust,Rust,我正在学习Rust,我有以下代码: use std::sync::{Arc, Mutex}; use std::thread::spawn; pub struct MyText { my_text: Mutex<Vec<String>>, } pub trait MyTextOptions { fn add(&self, t: String); } impl MyTextOptions for MyText { fn add(&

我正在学习Rust,我有以下代码:

use std::sync::{Arc, Mutex};
use std::thread::spawn;

pub struct MyText {
    my_text: Mutex<Vec<String>>,
}

pub trait MyTextOptions {
    fn add(&self, t: String);
}

impl MyTextOptions for MyText {
    fn add(&self, text: String) {
        let int_text = Arc::new(self);
        let put_into_my_text = spawn(move || {
            let mut text_feed = int_text.my_text.lock().unwrap();
            text_feed.push(text)
        });
        put_into_my_text.join();
    }
}
使用std::sync::{Arc,Mutex};
使用std::thread::spawn;
发布结构MyText{
我的文本:互斥体,
}
发布特性MyTextOptions{
fn添加(&self,t:String);
}
为MyText执行MyText选项{
fn添加(&self,文本:字符串){
让int_text=Arc::new(self);
让我们把你放入我的文本=繁殖(移动){
让mut text_feed=int_text.my_text.lock().unwrap();
文本推送(文本)
});
将_放入我的_文本中。join();
}
}
当我尝试运行它时,我得到:

错误[E0495]:由于需求冲突,无法推断适当的生存期
-->src\buffer.rs:37:33
|
37 |让int_text=Arc::new(self);
|                                 ^^^^
|
注意:首先,生命周期不能超过方法体上36:5定义的匿名生命周期#1。。。
-->src\buffer.rs:36:5
|
36 |/fn添加(&self,文本:字符串){
37 | |让int_text=Arc::new(self);
38 | |让我们把|放入|我的|文本=繁殖(移动| |{
39 | |让mut text_feed=int_text.my_text.lock().unwrap();
...  |
42 | |将|放入|我的|文本中。join();
43 | |     }
| |_____^
=注意:…因此表达式是可赋值的:
需要缓冲区::MyText(&B)
找到缓冲区::MyText(&F)
=注意:但是,生存期必须对静态生存期有效。。。
注意:…以便`[closure@src\buffer.rs:38:38:41:10 int_text:std::sync::Arc,text:std::string::string]`将满足其所需的生存期限制
-->src\buffer.rs:38:32
|
38 |让我们把|放入|我的|文本=繁殖(移动| |{
|

在使用线程时,我似乎无法理解rust中变量的生存期。无论我如何使用此函数,我仍然会遇到这种类型的错误。

通过
thread::spawn
生成的线程在理论上可以比其父线程寿命长。如果子线程可以引用来自父线程的数据,这些引用将失效当父线程停止时,le(无效)。这表示为
线程::spawn
的闭包上的
静态
绑定。编译器不理解
在同一函数中加入
线程的事实,因此限制仍然有效

您已经尝试使用
(可能是为了解决此问题),但您正在创建一个
,该弧已经是一个引用。因此,您只是将一个引用放入
。该值不满足
静态
范围,这就是您得到错误的原因

有多种方法可以解决此问题,其中许多方法取决于项目的总体架构。最简单的方法之一是使用
横梁
中的
范围
(或者具体地说,
横梁使用
):

使用横梁工具::螺纹;
为MyText执行MyText选项{
fn添加(&self,文本:字符串){
线程::范围(| s|){
s、 产卵{
让mut text_feed=self.my_text.lock().unwrap();
文本推送(文本)
});
}).unwrap();
}
}
这是一个奇特的助手函数,它实际上允许您通过确保子线程在父线程结束之前结束,从而从父范围借用值


另一种解决方案是将
MyText
值放入
Arc
(值得注意的是:按值,而不是按引用)。然后你可以多次克隆这个
Arc
,并将其发送到一个新线程。但这意味着你不能使用将
&self
作为接收器的方法,但你必须用另一种方法来解决它。

基本上,你在该函数期间借用了
self
。该线程可以比该函数更长。谢谢,但当我像这样实现它,我得到:
30 | impl MyTextOptions for MyText{^^^^^^^^^^^^^^^^-帮助:指示匿名生存期:`我不再使用此解决方案获得上述错误。
编译器不理解您在同一函数中加入线程的事实…
为什么。。。?