我有一个外部geometry
包,它定义了一个由浮点数组成的矩形结构和一个外部sdl2
包,它定义了一个由整数组成的矩形结构。
以下代码是我希望使用geometry::Rect
特征将sdl2::SdlRect
转换为std::convert::From
的方式:
extern crate geometry;
extern crate sdl2;
fn main() {
let geo_rect = geometry::Rect::default();
let sdl_rect = sdl2::SdlRect::from(geo_rect);
}
impl From<geometry::Rect> for sdl2::SdlRect {
fn from (rect: geometry::Rect) -> sdl2::SdlRect {
sdl2::SdlRect {
x: rect.x as i32,
y: rect.y as i32,
w: rect.w as i32,
h: rect.h as i32,
}
}
}
不幸的是,这不能编译,因为我正在实现的特征或者它正在实现的结构必须来自当前的包。我发现唯一有效的解决方案是定义一个反映MyFrom
特征功能的std::convert::From
特征:
extern crate geometry;
extern crate sdl2;
fn main() {
let geo_rect = geometry::Rect::default();
let sdl_rect = sdl2::SdlRect::my_from(geo_rect);
}
pub trait MyFrom<T> {
fn my_from(T) -> Self;
}
impl MyFrom<geometry::Rect> for sdl2::SdlRect {
fn my_from (rect: geometry::Rect) -> sdl2::SdlRect {
sdl2::SdlRect {
x: rect.x as i32,
y: rect.y as i32,
w: rect.w as i32,
h: rect.h as i32,
}
}
}
我对这个解决方案并不是特别满意,因为知道何时拨打my_from
而不是from
会让人感到困惑。还有另一种方法让我用更惯用的Rust来解决这个问题吗?