意外的类型推断失败:类型参数的数量错误

Unexpected type inference failure: wrong number of type arguments

在此示例中,编译器无法推断矩阵类型:

type Mat4x4<T> = [T; 16];

fn main() {
    let m: Mat4x4 = [0.4323f32; 16];
    println!("{:?}", m);
}

工作代码是:

type Mat4x4<T> = [T; 16];

fn main() {
    let m: Mat4x4<f32> = [0.4323f32; 16];
    println!("{:?}", m);
}

这是预期的行为吗?

你不能省略必需的类型参数,但你可以使用 _ 来推断它们:

let m: Mat4x4<_> = [0.4323f32; 16];

或者,您可以添加一个默认类型参数,以便在类型 T 正好是 f32 时可以省略 <…>(但这不是类型推断,您仍然需要明确地写 Mat4x4<f64>)。

type Mat4x4<T = f32> = [T; 16];
let m: Mat4x4 = [0.4323f32; 16];

这不是类型推断问题:

type Mat4x4<T> = [T; 16];

fn main() {
    let m: Mat4x4 = [0.4323f32; 16];
    println!("{:?}", m);
}

产生以下错误消息:

error[E0107]: wrong number of type arguments: expected 1, found 0
 --> src/main.rs:4:12
  |
4 |     let m: Mat4x4 = [0.4323f32; 16];
  |            ^^^^^^ expected 1 type argument

这里的抱怨是Mat4x4不是类型,它是模板蓝图来创建类型。

打个比方,Mat4x4 是一个华夫饼熨斗,Mat4x4<f32> 是用它做出来的华夫饼。如果你吃的是华夫饼铁(当然上面有枫糖浆),你可能会失望!

这同样适用于此:当您向编译器提供它期望最终产品的蓝图时,它会向您发出信号,表明它不是它所期望的。


您可以提供一个伪参数 (_),它会被推断为:

let m: Mat4x4<_> = [0.4323f32; 16];