我试图在同一特征中声明的函数中返回静态调度的特征,但编译器似乎无法在特征类型和具体类型之间进行映射。
示例:
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
答案 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
。