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
,而不改变函数体。