有什么方法可以为受特征限制的任何类型实现 Add 特征吗?
Is there some way to implement the Add trait for any type bounded by a trait?
我正在通读 "Advanced Traits" section of the Rust book,其中有一个添加两种不同类型的示例:
use std::ops::Add;
struct Millimeters(u32);
struct Meters(u32);
impl Add<Meters> for Millimeters {
type Output = Millimeters;
fn add(self, other: Meters) -> Millimeters {
Millimeters(self.0 + (other.0 * 1000))
}
}
假设我有一个 Millimeters
和 Meters
都实现的特征,它指定了如何将自己变成米(并假设 Millimeters
和 Meters
实现了这个) :
trait Length {
fn to_meters(&self) -> Meters;
}
有没有什么方法可以编写更通用的 Add
特征,看起来像这样(这是无效的):
impl Add<T: Length> for Millimeters {
type Output = Meters;
fn add(&self, other: &T) -> Meters {
let as_meters = other.to_meters();
Meters((self.0 / 1000) + (as_meters.0))
}
}
是的,除非你莫名其妙地将特征绑定到错误的位置并将函数签名更改为引用而不是值。修复使其工作:
impl<T: Length> Add<T> for Millimeters {
type Output = Meters;
fn add(self, other: T) -> Meters {
let as_meters = other.to_meters();
Meters((self.0 / 1000) + (as_meters.0))
}
}
不过我会使用 Into
和一个 where
子句:
impl<T> Add<T> for Millimeters
where
T: Into<Meters>,
{
type Output = Meters;
fn add(self, other: T) -> Meters {
let as_meters = other.into();
Meters((self.0 / 1000) + (as_meters.0))
}
}
我正在通读 "Advanced Traits" section of the Rust book,其中有一个添加两种不同类型的示例:
use std::ops::Add;
struct Millimeters(u32);
struct Meters(u32);
impl Add<Meters> for Millimeters {
type Output = Millimeters;
fn add(self, other: Meters) -> Millimeters {
Millimeters(self.0 + (other.0 * 1000))
}
}
假设我有一个 Millimeters
和 Meters
都实现的特征,它指定了如何将自己变成米(并假设 Millimeters
和 Meters
实现了这个) :
trait Length {
fn to_meters(&self) -> Meters;
}
有没有什么方法可以编写更通用的 Add
特征,看起来像这样(这是无效的):
impl Add<T: Length> for Millimeters {
type Output = Meters;
fn add(&self, other: &T) -> Meters {
let as_meters = other.to_meters();
Meters((self.0 / 1000) + (as_meters.0))
}
}
是的,除非你莫名其妙地将特征绑定到错误的位置并将函数签名更改为引用而不是值。修复使其工作:
impl<T: Length> Add<T> for Millimeters {
type Output = Meters;
fn add(self, other: T) -> Meters {
let as_meters = other.to_meters();
Meters((self.0 / 1000) + (as_meters.0))
}
}
不过我会使用 Into
和一个 where
子句:
impl<T> Add<T> for Millimeters
where
T: Into<Meters>,
{
type Output = Meters;
fn add(self, other: T) -> Meters {
let as_meters = other.into();
Meters((self.0 / 1000) + (as_meters.0))
}
}