如何实现不同内部类型之间的转换



这会产生E0119:

#![feature(destructuring_assignment)]
pub struct Point<T> {
pub x: T,
pub y: T,
}
impl<F, T: From<F>> From<Point<F>> for Point<T> {
fn from<F>(f: Point<F>) -> Self {
let Point { mut x, mut y } = f;
(x, y) = (T::from(x), T::from(y));
Self { x, y }
}
}

实现冲突发生在T:的std::convert::From中

impl<T> From<T> for T {
fn from(t: T) -> T {
t
}
}

我认为没有办法解决这个问题,因为对于内部类型之间的转换问题,可能会有更可靠的惯用方法,甚至对";"问题";是.

您可以将其实现为一个接受闭包的普通方法,然后在调用它时将其传递给From::fromtrait方法。甚至可以将其专门化为实现From<T>:的类型

#[derive(Debug)]
pub struct Point<T> {
pub x: T,
pub y: T,
}
impl<T> Point<T> {
pub fn map<U>(self, mut f: impl FnMut(T) -> U) -> Point<U> {
let Point { x, y } = self;
Point {
x: f(x),
y: f(y),
}
}
pub fn map_into<U: From<T>>(self) -> Point<U> {
let Point { x, y } = self;
Point {
x: U::from(x),
y: U::from(y),
}
}
}
fn main() {
let point_i16 = Point { x: 6i16, y: 3200i16 };
let point_f32: Point<f32> = point_i16.map(From::from);
let point_f64: Point<f64> = point_f32.map_into();
println!("{:?}", point_f64); // Point { x: 6.0, y: 3200.0 }
}

最新更新