Передача различных признаков реализации в зависимости от значения времени выполнения - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь использовать что-то, эквивалентное следующему коду:

struct MyStruct {}

struct MyStruct2 {}

trait CanDoIt {
    fn do_it(&self) -> String;
}

impl CanDoIt for MyStruct {
    fn do_it(&self) -> String {
        "done".into()
    }
}


impl CanDoIt for MyStruct2 {
    fn do_it(&self) -> String {
        "done 2".into()
    }
}


fn do_a<T: CanDoIt>(value: T) -> String {
    value.do_it()
}


fn main() {
    let s: dyn CanDoIt = if true {
        MyStruct {}
    } else {
        MyStruct2 {}
    };

    println!("Done it: {}", do_a(s))
}

Условие if может зависеть от некоторого значения времени выполнения, например, поддерживает ли оборудование какую-либо функцию.

Я пробовал разные вещи, такие как создание структуры, также реализующей Sized, но я всегда получаю некоторую ошибку компиляции, такую ​​как:

   |
29 |     let s: dyn CanDoIt = if true {
   |         ^ doesn't have a size known at compile-time
   |

Каково решение, когда вам нужно обойти разные реализации в зависимости от некоторыхвремя выполнения?

1 Ответ

1 голос
/ 01 ноября 2019

Черты, подобные вашему CanDoIt, не имеют размера, потому что они не являются конкретным типом и, следовательно, не могут быть сохранены как значения напрямую. Можно хранить только объект черты как Box<dyn CanDoIt> или &dyn CanDoIt

Так что для вашего примера использования &dyn CanDoIt это будет выглядеть так:

struct MyStruct {}

struct MyStruct2 {}

trait CanDoIt {
    fn do_it(&self) -> String;
}

impl CanDoIt for MyStruct {
    fn do_it(&self) -> String {
        "done".into()
    }
}


impl CanDoIt for MyStruct2 {
    fn do_it(&self) -> String {
        "done 2".into()
    }
}


fn do_a(value: &dyn CanDoIt) -> String {
    value.do_it()
}


fn main() {
    let s: &dyn CanDoIt = if true {
        &MyStruct {}
    } else {
        &MyStruct2 {}
    };

    println!("Done it: {}", do_a(s))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...