从另一个箱子实现std :: convert :: From类型

时间:2016-06-19 06:41:09

标签: rust

我有一个外部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来解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

更好地定义包含外部定义矩形的自己的矩形类型,并使用标准From特征。

这是newtype模式的一种可能用途。