You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为泛型类型实现From trait,实现Rect<T>到Size<T>的转换?

正确实现从Rect到Size的From trait

原代码的核心问题

  • 错误地将Rect<T>结构体当作trait来约束泛型参数,T: Rect<H>这种写法不成立,因为Rect是结构体而非trait
  • height和width方法接收&self,原代码调用逻辑虽能自动解引用,但缺少明确的泛型运算约束
  • 多余的类型转换as T,rect.height()的返回值本身就是T类型
  • 未声明T的运算约束:Rect的height/width方法用到减法,需要T实现std::ops::Sub trait且输出类型为自身

修正后的完整代码

use std::convert::From;
use std::ops::Sub;

pub struct Rect<T> {
    pub top_left: (T, T), // 0 is x, 1 is y.
    pub bottom_right: (T, T), // 0 is x, 1 is y.
}

impl<T> Rect<T>
where
    T: Sub<Output = T>,
{
    pub fn new(top_left: (T, T), bottom_right: (T, T)) -> Self {
        Rect { top_left, bottom_right }
    }

    pub fn height(&self) -> T {
        self.bottom_right.1 - self.top_left.1
    }

    pub fn width(&self) -> T {
        self.bottom_right.0 - self.top_left.0
    }
}

pub struct Size<T> {
    pub height: T,
    pub width: T,
}

impl<T> Size<T> {
    pub fn new(height: T, width: T) -> Self {
        Size { height, width }
    }
}

// 正确实现From<Rect<T>> for Size<T>
impl<T> From<Rect<T>> for Size<T>
where
    T: Sub<Output = T> + Copy, // 添加Copy约束适配数值类型的复制需求
{
    fn from(rect: Rect<T>) -> Self {
        Size::new(rect.height(), rect.width())
    }
}

关键说明

  1. 泛型约束调整:

    • 为Rect<T>的实现添加T: Sub<Output = T>约束,确保T支持减法运算且结果类型为自身
    • 为From实现添加Copy约束(针对数值类型设计),因为height/width返回的T需要被复制到Size的字段中;若不需要Copy,可改用Clone约束并调用.clone()
  2. 正确的From实现:

    • 直接针对Rect<T>实现From trait,目标类型为Size<T>,支持Size::from(rect)或rect.into()两种转换方式
  3. 简化调用逻辑:

    • 移除多余的类型转换,直接使用rect.height()和rect.width()的返回值初始化Size

测试示例

fn main() {
    let rect = Rect::new((0, 0), (10, 20));
    let size: Size<i32> = rect.into();
    assert_eq!(size.height, 20);
    assert_eq!(size.width, 10);
}

内容的提问来源于stack exchange,提问作者linrongbin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 04:13:15