无法从SPRS库初始化TriMat矩阵

问题描述 投票:1回答:2

我试图使用稀疏矩阵库SPRS时遇到了问题初始化一个矩阵。为什么这个不行?

extern crate sprs;
use sprs::TriMat;

fn main() {
    let mut matrix = TriMat::new((5, 5));
}

错误的是

error[E0282]: type annotations needed
 --> src/main.rs:5:22
  |
5 |     let mut matrix = TriMat::new((5, 5));
  |         ----------   ^^^^^^^^^^^ cannot infer type for `N`
  |         |
  |         consider giving `matrix` a type
syntax rust type-inference
2个回答
3
投票

你只需要告诉它该矩阵的元素的类型。例如,如果它是i32的矩阵,那么:

let mut matrix: TriMat<i32> = TriMat::new((5, 5));

这不能从new构造推断,因为这仅需要对矩阵,其中不包括元素类型的元件的形状的参数。

如果你真正开始在矩阵存储数据,那么该类型的注释大多不会是必要的,因为它会从数据推断:

let mut matrix = TriMat::new((5, 5));
matrix.add_triplet(0, 0, 42); // 42 literal is `i32` by default.

1
投票

TriMat是:

type TriMat<N> = TriMatI<N, usize>;

TriMatI是:

type TriMatI<N, I> = TriMatBase<Vec<I>, Vec<N>>;

TriMatBase是:

pub struct TriMatBase<IStorage, DStorage> { /* fields omitted */ }

TriMatBase::new是:

pub fn new(shape: (usize, usize)) -> TriMatI<N, I>

把这些放在一起,你得到有效调用

TriMatBase::<_, usize>::new((5, 5));

第一种类型的参数,根据您所提供的代码是不可判定。在很多情况下,你做的有价值的东西,这将使编译器拖住具体类型。既然你只是构建它,把它扔掉,还有的类型,这可能最终会被一个理论无限数量。

你需要使用turbofish指定类型:

TriMat::<usize>::new((5, 5));

或变量的显式类型:

let matrix: TriMat<usize> = TriMat::new((5, 5));

或者多写一些代码,这将迫使编译器知道具体类型。

© www.soinside.com 2019 - 2024. All rights reserved.