使用静态分派返回特征类型
Returning a trait type with static dispatch
我正在尝试 return 在同一特征中声明的函数中的静态分派特征,但编译器似乎无法在特征类型和具体类型之间进行映射。
示例:
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
编译器就在这里。您告诉它的是,您正在实现一个函数 trade
,对于调用者愿意使用的任何 M
(只要它实现了 Money
),您将 return 的一个实例 M
。然后你去尝试return一个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
函数更改为始终 return 它实现的类型;在 Money
特征定义中,即 Self
。当您谈论 特定的 实现时,它是实现类型(因此当您为 Dollar
实现 Money
时它是 Dollar
)。
我正在尝试 return 在同一特征中声明的函数中的静态分派特征,但编译器似乎无法在特征类型和具体类型之间进行映射。
示例:
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
编译器就在这里。您告诉它的是,您正在实现一个函数 trade
,对于调用者愿意使用的任何 M
(只要它实现了 Money
),您将 return 的一个实例 M
。然后你去尝试return一个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
函数更改为始终 return 它实现的类型;在 Money
特征定义中,即 Self
。当您谈论 特定的 实现时,它是实现类型(因此当您为 Dollar
实现 Money
时它是 Dollar
)。