如何在Rust中使用泛型?
比如从一个字符串读入转换为矩阵
struct Matrix<T> {
containner: Box<Vec<Vec<T>>>,
size: (usize, usize),
}
impl std::str::FromStr for Matrix<i8> {
type Err = std::num::ParseIntError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let parse_out: Vec<Vec<i8>> = s
.split(';')
.map(|i| i.split(',').map(|j| i8::from_str(j).unwrap()).collect())
.collect();
let n = parse_out.len();
let m = parse_out.iter().map(|x| x.len()).max().unwrap();
let mat = Matrix::<i8> {
containner: Box::new(parse_out),
size: (m, n),
};
return Ok(mat);
}
}
在编写这个矩阵时遇到三个问题:
- 怎么限制类型
T
为i8
,i16
...u8
,u16
...f32
,f64
,isize
,usize
等等一系列数字类型? - 为Matirx实现
from_str
方法时,如果不具体指定类型,首先type Err
无法指定,其次在T::from_str(j).unwrap()
时会报错,提示unwrap
不一定有实现(这似乎是一个问题?)。如果指定类型,则会有大量代码重复,因为要为每一个类型都重写一遍。 - 本身
from_str
指定了参数和返回类型,但是现在方法中需要额外的参数(行和列的分隔符),应该怎么设计?这里我因作业需要,直接指定为,
和;
了。
想了想了一会,感觉
- 类型那个可能需要定义宏???我刚刚看完rust的官方教程,感觉教程上关于宏的内容讲的好少,就是简单提一下。看完好像意思是生成代码的代码。emmm
- 如果实在不行,可能还需要自己撸一个num类,以及一系列我觉得该有但是没有的。
- 在crates.io上翻到了num-trait包。看来rust的官方库确实有很多该有的没有。┑( ̄Д  ̄)┍
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
可以通过 marker trait (没有方法、只做标识)实现:
如果不允许其他人扩展,可以参考:Sealed traits protect against downstream implementations (C-SEALED)套一个私有模块。
可以转成自己的错误类型,也可以这样用直接用已有的错误类型:
建议是用自己的错误类型。
FromStr
上。例如数字能跟进制解析,所以整数类型都有个单独的from_str_radix
方法。