我正在尝试在Rust中创建一个解析器,读取我们模拟的输出文件,找到正确的块,返回该块的内容。根据给定的维度确定它可以是单个int或int或float向量。
但是,我找不到一种使用通用类型T的方法来使相同的函数适用于i32和f64数字。
我不知道如何以这种方式使用泛型。
我今天刚开始学习Rust,请像我五岁的孩子一样向我解释解决方案。
我的理解问题的简化版本如下:
但我得到了“预期类型参数T,找到i32”的错误提示,在parse_b2f函数的最后一行指向nentries。如果我在main函数中提供了i32作为函数调用的参数,为什么T仍然被视为通用类型而不是i32呢? 如果我将T更改为i32,则函数可以正常工作,但想法是让用户传递类型(对于索引数组为i32,对于实验数据数组为f64等),而不是编写两个完全相同逻辑的函数。
我本来希望能够做类似于
我也考虑过使用枚举类型:
但是,我找不到一种使用通用类型T的方法来使相同的函数适用于i32和f64数字。
我不知道如何以这种方式使用泛型。
我今天刚开始学习Rust,请像我五岁的孩子一样向我解释解决方案。
我的理解问题的简化版本如下:
fn parse_b2f<T>(dims: Vec<i32>) -> Result<Vec<T>, String> {
let nentries = dims.iter().fold(1, |res, a| res*a);
Ok(vec![nentries])
}
fn main() {
let dims = vec![3720, 9];
let data = parse_b2f::<i32>(dims);
}
但我得到了“预期类型参数T,找到i32”的错误提示,在parse_b2f函数的最后一行指向nentries。如果我在main函数中提供了i32作为函数调用的参数,为什么T仍然被视为通用类型而不是i32呢? 如果我将T更改为i32,则函数可以正常工作,但想法是让用户传递类型(对于索引数组为i32,对于实验数据数组为f64等),而不是编写两个完全相同逻辑的函数。
我本来希望能够做类似于
vec![nentries as T]
的事情,因为使用i32和f64单独运行很好,但在T上不起作用。我也考虑过使用枚举类型:
enum Numbers {
I32(i32),
F64(f64),
}
使用 T 而非其他替代品
fn parse_b2f<Numbers>(dims: Vec<i32>) -> Result<Vec<Numbers>, String> {...}
let data = parse_b2f::Numbers::I32(dims);
但是我不太清楚在这种情况下如何使用该枚举。
std::ops
和num-traits
包中有很多特性可能会有用,而且你总是可以创建自己的特性并在数字类型上实现它们。 - cdhowie