Возвращение черты со связанным типом - PullRequest
0 голосов
/ 03 ноября 2019
struct A;
struct PropA;

struct B;
struct PropB;

trait AB{
    type prop;
    fn a(&self) -> ();
    fn b(&self, p: Self::prop) -> ();
}

impl AB for A{
    type prop = PropA;
    fn a(&self)->(){}
    fn b(&self, p: Self::prop) -> (){}
}
impl AB for B{
    type prop = PropB;
    fn a(&self)->(){}
    fn b(&self, p: Self::prop) -> (){}
}

fn get_a_or_b(s: &str) -> Option<Box<dyn AB<prop=_>>>{
    match s{
        "a" => Some(Box::new(A)),
        "b" => Some(Box::new(B)),
        _=> None
    }
}

ссылка на игровую площадку

Я возвращаю две разные структуры A & B на основе строкового ввода.

Я получаю the type placeholder '_' is not allowed within types on item signatures при указании связанного типа в качестве заполнителя.

1 Ответ

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

Я считаю, что здесь есть неправильное представление;dyn AB<Prop = A> и dyn AB<Prop = B> - это разные типы, первый - динамический AB<Prop = A>, а второй - динамический AB<Prop = B>. Это означает, что вы не можете оставить универсальные типы и связанные типы до динамического аспекта.

Это отличается от того, когда связанный тип не упоминается:

fn foo<T: AB>() {
    let my_fn: fn(&T, T::Prop) = T::b;
}

Где мы получаем доступ к T::Prop вместо его присвоения.


Все типы должны быть конкретными, и dyn AB<Prop = A> на одной ветви, а dyn AB<Prop = B> на другой ветви не конкретны, но могут быть упакованы в перечисление:

enum AOrB {
    A(Box<dyn AB<Prop = A>>),
    B(Box<dyn AB<Prop = B>>),
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...