我有一个外部的
geometry
crate,它定义了一个由浮点数构成的矩形结构体,还有一个外部的 sdl2
crate,它定义了一个由整数构成的矩形结构体。
以下代码展示了我期望使用 std::convert::From
trait 将 geometry::Rect
转换成 sdl2::SdlRect
:
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,
}
}
}
不幸的是,这段代码无法编译,因为要么正在实现的trait或要为其实现的结构体必须来自当前crate。我发现的唯一解决方案是定义一个 MyFrom
trait,它反映了 std :: convert :: From
trait的功能:
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惯用法的解决方法?
my_from
方法更改为from_sdl
。将该方法命名为from_sdl
与标准库的CStr::from_bytes
方法保持一致。 - Brianimpl Into<other_crate::Type> for my_crate::Type
而不是 newtype,如果您只需要执行单向转换? - Sean Pianka