返回一个具有关联类型的特质

3
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
    }
}

Playground链接

根据字符串输入,我返回两个不同的结构体A&B

当使用占位符指定关联类型时,出现了类型占位符“_”不允许在项目签名中的类型中错误提示。

1个回答

4
我认为这里存在误解: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>>),
}

1
但是如果我需要调用 a_or_b.a(),那么我就需要写重复的匹配分支,我想我可以使用一个宏来简化。 - Slim Shady

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接