gpt4 book ai didi

rust - 在 Rust 中设置结构构造函数的类型

转载 作者:行者123 更新时间:2023-11-29 08:13:48 26 4
gpt4 key购买 nike

我在 Rust 中有一个支持通用元素数据类型的矩阵数据类型。

pub struct Matrix<T> {
data: Vec<T>, // row-major storage
nrows: usize,
ncols: usize,
}

我想创建一系列不同的矩阵构造函数,例如 zeroeye,它们分别输出零矩阵和单位矩阵。标准的 Matrix::new() 构造函数很简单:

impl<T> Matrix<T> {
pub fn new(data: Vec<T>, nrows: usize, ncols: usize) -> Matrix<T> {
assert!(data.len() == nrows*ncols);

Matrix { data: data, nrows: nrows, ncols: ncols }
}
}

基础类型 T 是从初始化向量的类型推断出来的。但是,当我尝试编写 Matrix::zero() 构造函数时,我遇到了如何推断类型的问题,因为我想传递的唯一参数是大小。

impl<T> Matrix<T> {
pub fn zero(nrows: usize, ncols: usize) -> Matrix<T>
where T : Clone
{
let data: Vec<T> = vec![0; nrows*ncols];
Matrix::new(data, nrows, ncols)
}
}

尝试编译会导致错误消息:

error[E0308]: mismatched types                                                                                                                
--> src/tools.rs:39:33
|
39 | let data: Vec<T> = vec![0; nrows*ncols];
| ^ expected type parameter, found integral variable
|
= note: expected type `T`
found type `{integer}`

我尝试了 0 as TT::from(0) 但这些都没有解决问题。 (老实说,我还不明白为什么。)一种可能的解决方案是将函数定义更改为 zero(_value: T, nrows: usize, ncols: usize) 并构造数据向量通过 vec![_value; ...] 但这似乎很奇怪。

无论我的最终目标是能够简单地编写什么解决方案,

let a: Matrix<f32> = Matrix::zero(nrows, ncols);
// ... or ...
let b = Matrix<f32>::zero(nrows, ncols);
// ... or ...
let c = Matrix::zero<f32>(nrows, ncols);
// ... or something else?

最佳答案

您可能想使用 num crate,它为这种情况添加了特征。

类似于:

extern crate num;
use num::Zero;

impl<T> Matrix<T> {
pub fn zero(nrows: usize, ncols: usize) -> Matrix<T>
where T : Clone + Zero
{
let data: Vec<T> = vec![T::zero(); nrows*ncols];
Matrix::new(data, nrows, ncols)
}
}

可能会起作用,因为它将您的矩阵类型定义为受实现 num::Zero 特征的类型限制。这是在所有整数和浮点基元上实现的,也可以为自定义类型实现。

如果你不想导入 num crate,你可以像下面这样手动定义这个特性,尽管它需要你自己为原语实现它。

trait Zero {
fn zero() -> Self;
}
impl Zero for f32 {
fn zero() -> Self {
0.0
}
}
...

关于rust - 在 Rust 中设置结构构造函数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53565970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com