Rust 为什么';克隆所拥有的变量所需的静态生存期
我一生都在与铁锈作斗争: 为什么Rust 为什么';克隆所拥有的变量所需的静态生存期,rust,Rust,我一生都在与铁锈作斗争: 为什么运行测试需要静态生命周期 我希望它的行为像run\u-concrete\u-test 我读了文档,搜索了stackoverflow和锈迹斑斑的书,但我显然遗漏了一些东西 使用std::thread; #[派生(调试、克隆)] 结构测试{ 测试字符串:字符串, } 特征示例{ fn tst(&self)->(); } 用于测试的impl示例{ fn tst(&self){ println!(“{:?}”,self); } } //编译,这里没有“静态” fn运行混凝
运行测试需要静态生命周期
我希望它的行为像run\u-concrete\u-test
我读了文档,搜索了stackoverflow和锈迹斑斑的书,但我显然遗漏了一些东西
使用std::thread;
#[派生(调试、克隆)]
结构测试{
测试字符串:字符串,
}
特征示例{
fn tst(&self)->();
}
用于测试的impl示例{
fn tst(&self){
println!(“{:?}”,self);
}
}
//编译,这里没有“静态”
fn运行混凝土测试(测试仪:&测试){
设t=tester.clone();
线程::生成(移动| |{
t、 tst();
});
}
//使用“静态”进行编译
//但是F不应该只是静态的
fn运行特性测试(测试仪和静态F)
哪里
F:示例+同步+发送+静态,
{
设t=tester.clone();
让store_t=thread::spawn(move | |{
t、 tst();
});
}
fn main(){
//不运行,无静电
设x=Test{
测试字符串:“测试字符串”。到字符串(),
};
运行混凝土试验(&x);
//由于静态错误,无法编译
//运行特性测试(&x);
println!(“{:?}”,x);
}
:
以下特性适用于所有&T,而不考虑
其所指对象的类型:
- 克隆(请注意,如果T的克隆实现存在,则这不会延迟到T的克隆实现!)
由于F
具有静态
生存期边界,&F
是一种共享变量:
- 没有
Clone
边界编译器将使用借用的Clone
F
的版本(只需克隆引用)
- 使用
Clone
边界,编译器将使用F
的Clone
在所有这些情况下,下面的代码将与运行混凝土测试时的代码相同:
特征示例{
fn测试(自我测试);
}
fn运行特性测试(测试仪:&F)
哪里
F:示例+同步+发送+克隆+静态,
{
设t=tester.clone();
::std::thread::spawn(移动| |){
t、 test();
});
}
注意:如果没有静态
寿命边界,F
可能被视为某些T
的借用类型,如F=&T
那太好了why@hellow那么trait ref参数和Test ref参数之间有什么区别呢?测试引用是否隐式为“静态”的?您在作弊;)您使用的是tester.clone()
,这就是为什么它在没有静态的情况下工作的原因。如果将其移除,并将tester
直接移动到闭包中,则会出现相同的错误@他有点…:)目前,我的工作主要是让代码运行并理解事情是如何工作的。我只是想让具体的实现变得更一般。只是希望我可以从run\u concrete\u test
转到run\u trait\u test
,而不改变函数体。