我试图使用稀疏矩阵库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
你只需要告诉它该矩阵的元素的类型。例如,如果它是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.
TriMat
是:
type TriMat<N> = TriMatI<N, usize>;
TriMatI
是:
type TriMatI<N, I> = TriMatBase<Vec<I>, Vec<N>>;
pub struct TriMatBase<IStorage, DStorage> { /* fields omitted */ }
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));
或者多写一些代码,这将迫使编译器知道具体类型。