返回具有静态分派的特征类型

时间:2015-02-03 07:09:47

标签: generics rust traits

我试图在同一特征中声明的函数中返回静态调度的特征,但编译器似乎无法在特征类型和具体类型之间进行映射。

示例:

trait Money {
    fn trade<M>(&self) -> M
        where M: Money;
}

impl Money for Dollar {
    fn trade<M>(&self) -> M
        where M: Money
    {
        Dollar { amount: self.amount / 2 }
    }
}

您可以在此处试用完整示例:http://is.gd/alQGv0

1 个答案:

答案 0 :(得分:6)

编译器就在这里。你告诉它的是你正在实现一个函数trade,对于调用者所使用的任何M来说(只要它实现了Money),你将返回一个M的实例。然后你去尝试返回Dollar。如果M不是Dollar

,该怎么办?

从上下文来看,您可能需要的是以下内容:

trait Money {
    fn trade(&self) -> Self;
}

struct Dollar {
    amount: usize,
}

impl Money for Dollar {
    fn trade(&self) -> Dollar
    {
        Dollar { amount: self.amount / 2 }
    }
}

fn main() {
    let x = Dollar { amount: 10 };
    println!("{}", x.trade().amount);
}

此处,trade函数更改为始终返回其实现的类型;在Money特质定义中,Self。当您谈论特定的实现时,它就是实现类型(当Dollar}实现Money时,它就是Dollar