Почему компилятору нужно статическое время жизни для клонированной и затем перемещенной переменной? - PullRequest
2 голосов
/ 28 мая 2019

Я немного борюсь с временами ржавчины: почему '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);
}

1 Ответ

3 голосов
/ 28 мая 2019

Из ссылки :

Следующие черты реализованы для всех & T, независимо от типа их референта:

  • ...
  • Clone (обратите внимание, что это не будет зависеть от реализации T's Clone, если она существует!)
  • ...

, поскольку F имеет 'static border &F - это тип совместно используемой переменной:

  • Без Clone компилятор границ будет использовать clone из заимствованной версии F, которая будет возвращать только заимствованную self
  • С границей Clone компилятор будет использовать реализацию клона F, которая вернет F

При всем этом приведенный ниже код будет работать так же, как с run_concrete_test:

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

    let store_t = thread::spawn(move || {
        t.tst();
    });
}

Примечание : В состоянии, когда F не имеет 'static границы, возможно, что F можно рассматривать как заемные средства некоторых Tтипа как F = &T

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...