从 C++ 走向 rust(六):泛型变量赋值问题

本文探讨了如何在Rust中使用From Trait解决将常数转换为泛型类型T的问题,以实现矩阵运算库中向量内积函数。通过实例展示了如何利用From和Into特性处理数值类型,并强调了泛型编程中Trait在确保类型安全的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 问题:let x: T = 0.0 编译不过去

fn myfun<T>() -> T {
	let x:T = 0.0;
	return x;
} 

2. 解决方案:数据转换

如何把 0.0 这样的常量转换成数据类型 T?这需要 T 实现必要的特性。本文遇到的问题可以采用下面的方法解决:

use std::convert::From;
fn myfun<T: From<f32> + From<f64>>() -> T {
	let x:T = T.From(0.0);
	return x;
} 

3. 我的项目跟踪

实际上这个问题来自我的项目。我的矩阵运算库的一个重要函数是计算两个向量的内积,即下面的 dot 函数。首先我需要让计算结果 result = 0,这个在 c++ 中是举手之劳。但是,rust 编译器不通过,原因是无法确定 0 是类型 T。

查了好多资料,终于搞明白,可以用数据转换功能把 0 转换为类型 T。当然,这要求类型 T 必须具备特征 From。代码如下:

...
use std::convert::From;
pub struct Vector<T: Clone + From<f32> + From<f64>> {
    data: Vec<T>
}
impl<T: Clone + From<f32> + From<f64>> Vector<T> {
    pub fn new(value: T, size: usize) -> Self { 
        Self{ data: vec![value; size] } 
    }
   	pub fn dot(v1: Self, v2:Self) -> T {
        let mut result = T::from(0.0);
        ...
        return result;
    }
}

还有一个名为 Into 的特性也和数据转换有关,原理差不多,如果需要可自行查资料,本文不再赘述。

可见,在泛型编程中特征 Trait 的价值很大,是实现语法逻辑的正确性检查的关键。接下来要用一个循环来计算两个变量的内积,为了高效率实现算法,我要还好好研究一下迭代器的原理。


原创不易,如果对您有帮助,请关注、点赞,谢谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值