2016-06-19 5 views
1

私は外部のgeometryのfloatで構成された矩形の構造体を定義し、外部のsdl2の整数からなる矩形の構造体を定義しています。私が実装してるの形質または構造体のいずれかがそれだから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, 
     } 
    } 
} 

は残念ながら、これはコンパイルされません:

次のコードは、私がstd::convert::From形質を使用してgeometry::Rectsdl2::SdlRectに変換するために期待する方法です現在の木箱から来なければなりません。 my_from代わりの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, 
     } 
    } 
} 

知っているので、私は、このソリューションには特に満足していない:作品私が見つけた唯一の解決策は、std::convert::From形質の機能を反映MyFrom形質を定義することですラインを混乱させる。よりイディオム的な錆を使ってこれを解決する別の方法がありますか?

答えて

2

外部定義矩形をラップする独自の矩形タイプを定義し、標準のFrom特性を使用する方が良い。

これは、newtypeパターンの1つの使用方法です。

+0

newtypeパターンは現行のRustでは未完成のようですが、限界を乗り越えようとするいくつかの箱がありますが、試行錯誤してコードを単純化していませんでした。私がやったことは、 'my_from'メソッドを' from_sdl'に変更することでした。 'from_sdl'メソッドの命名は、標準ライブラリの' CStr :: from_bytes'メソッドと同じです。 – Brian

関連する問題