@AHMED_RAPIRA

Почему нельзя в качестве результата match сделать impl Trait?

match всегда возвращает что-то конкретное, в данном случае оно будет ругаться что ожидает только A на строчке с 1. Как тогда можно сделать фабричный метод в языке rust, никак (как и все остальное из мира ООП)?

trait C {}

struct A {}

impl C for A {}

struct B {}

impl C for B {}

fn create(value: u8) -> impl C {
    match value {
        0 => A {},
        1 => B {},
        _ => A {},
    }
}
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
ozkriff
@ozkriff
Rust э̶н̶т̶у̶з̶и̶а̶с̶т сектант, хобби игродел
Потому что impl-trait это статический полиморфизм, работающий через мономорфизацию - т.е. при компиляции из абстратного дженерика через подстановку конкретных типов будет сгенерированно сколько-то конкретных версий функции.

Если зачем-то нужен ржавый фабричный метод, то, как вариант, можно перейти на динамическую диспечеризацию:

fn create(value: u8) -> Box<dyn C> {
    match value {
        0 => Box::new(A {}),
        1 => Box::new(B {}),
        _ => Box::new(A {}),
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы