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

在Rust中设置结构构造函数的类型,rust,Rust,我在Rust中有一个矩阵数据类型,它支持通用元素数据类型 pub结构矩阵{ 数据:Vec,//行主存储器 nrows:使用, ncols:使用, } 我想创建一系列不同的矩阵构造函数,例如分别输出零矩阵和单位矩阵的zero和eye。标准的Matrix::new()构造函数非常简单: impl矩阵{ 发布fn新(数据:Vec,nrows:usize,ncols:usize)->矩阵{ 断言!(data.len()==nrows*ncols); 矩阵{data:data,nrows:nrows,n

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

pub结构矩阵{
数据:Vec,//行主存储器
nrows:使用,
ncols:使用,
}
我想创建一系列不同的矩阵构造函数,例如分别输出零矩阵和单位矩阵的
zero
eye
。标准的
Matrix::new()
构造函数非常简单:

impl矩阵{
发布fn新(数据:Vec,nrows:usize,ncols:usize)->矩阵{
断言!(data.len()==nrows*ncols);
矩阵{data:data,nrows:nrows,ncols:ncols}
}
}
基础类型
T
是从初始化向量的类型推断出来的。但是,当我尝试编写
Matrix::zero()
构造函数时,我遇到了一些问题,无法确定如何推断类型,因为我只想传递大小参数

impl矩阵{
pub fn zero(nrows:usize,ncol:usize)->矩阵
其中T:Clone
{
let data:Vec=Vec![0;nrows*ncols];
矩阵::新(数据、NROW、NCOL)
}
}
试图编译此文件会导致错误消息:

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}`     

你可能想使用板条箱,它为这种情况增加了特征

比如:

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包,看看这是怎么回事。在我给你“回答的问题”之前,等待另一个可能的答案:)
trait Zero {
    fn zero() -> Self;
}
impl Zero for f32 {
    fn zero() -> Self {
        0.0
    }
}
...