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 的价值很大,是实现语法逻辑的正确性检查的关键。接下来要用一个循环来计算两个变量的内积,为了高效率实现算法,我要还好好研究一下迭代器的原理。
原创不易,如果对您有帮助,请关注、点赞,谢谢支持!