gpt4 book ai didi

rust - 从另一个 crate 的类型上实现 std::convert::From

转载 作者:行者123 更新时间:2023-11-29 08:16:42 25 4
gpt4 key购买 nike

我有一个外部 geometry crate,它定义了一个由 float 组成的矩形结构,还有一个外部 sdl2 crate,它定义了一个由整数组成的矩形结构。

以下代码是我希望如何使用 std::convert::From 将 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,
}
}
}

不幸的是,这不会编译,因为我正在实现的特征或它正在实现的结构必须来自当前的 crate 。我发现唯一可行的解​​决方案是定义一个 MyFrom 特征,它反射(reflect)了 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 来解决这个问题?

最佳答案

最好定义您自己的矩形类型来包装外部定义的矩形,并使用标准的 From 特征。

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

关于rust - 从另一个 crate 的类型上实现 std::convert::From,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37904628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com