为什么克隆需要拥有变量的静态寿命

墨菲

我在锈蚀寿命上有些挣扎:为什么'static需要寿命run_trait_test

我希望它表现得像 run_concrete_test

我阅读了文档,搜索了stackoverflow和锈皮书,但显然我遗漏了一些东西。

use std::thread;

#[derive(Debug, Clone)]
struct Test {
    test_string: String,
}

trait Example {
    fn tst(&self) -> ();
}

impl Example for Test {
    fn tst(&self) {
        println!("{:?}", self);
    }
}

// compiles, no 'static here
fn run_concrete_test(tester: &Test) {
    let t = tester.clone();
    thread::spawn(move || {
        t.tst();
    });
}

// compiles with 'static
// but F shouldn't be only static
fn run_trait_test<F>(tester: &'static F)
where
    F: Example + Sync + Send + 'static,
{
    let t = tester.clone();
    let store_t = thread::spawn(move || {
        t.tst();
    });
}

fn main() {
    //does run, no static
    let x = Test {
        test_string: "test string".to_string(),
    };
    run_concrete_test(&x);

    // doe sn't compile because of static
    // run_trait_test(&x);
    println!("{:?}", x);
}
奥马尔·埃尔登(Omar Erden)

从参考

不论引用的类型如何,所有&T都实现了以下特征:

  • ...
  • 克隆(请注意,如果存在,这将不遵循T的Clone实现!)
  • ...

由于F具有'static生命周期边界,&F是一种共享变量:

  • 没有Clone边界的编译器将使用clone借来的版本F(简单地说,它将只是克隆引用)
  • 随着Clone边界,编译器将使用实施FClone

有了这些,下面的代码将与run_concrete_test

trait Example {
    fn test(&self);
}

fn _run_trait_test<F>(tester: &F)
where
    F: Example + Sync + Send + Clone + 'static,
{
    let t = tester.clone();

    ::std::thread::spawn(move || {
        t.test();
    });
}

注意:没有'static生命的界限,可能F会被认为是某些T借来的类型,如F = &T

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么此变量定义表示静态寿命?

为什么ThreadLocal变量需要静态?

为什么静态内联变量需要“内联”?

为什么这个变量需要是静态的?

为什么需要这个克隆?

为什么git浅克隆可以比<depth>拥有更多提交?

为什么 Rust 需要此变量的“静态”生命周期?

为什么需要明确定义静态变量?

为什么这个变量寿命不长?

为什么静态最终变量使用静态方法初始化需要同步?

为什么`Arc <Mutex <dyn MyTrait >>`自动获得静态寿命?

为什么Java静态变量没有更新?

为什么Python没有静态变量?

为什么Java中没有局部静态变量?

为什么在拥有RTOS的同时需要可编程实时单元(PRU)?

为什么我们需要定义类的静态变量,而在函数内部不定义静态变量呢?

用Java克隆对象有什么需要

当我们拥有currentThread()方法时,为什么Thread类具有静态方法?

为什么一个变量需要在最终块静态

为什么非常数静态变量需要在类外部初始化?

为什么需要“设置变量”?

为什么在这里需要静态?

为什么扩展方法需要是静态的?

为什么不同于类的其他成员,我们为什么需要定义类的静态变量?

如何使用main中创建的变量调用需要“静态寿命”的函数?

为什么ArrayList具有克隆方法

Java多线程-如果拥有共享堆,为什么我们需要查看主内存(RAM)?

Data Vault 2.0-为什么在拥有信息市场时我们需要业务保险库?

Swift:为什么没有dynamicType的非静态方法不能调用静态变量和常量(静态let)?