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

时间:2016-05-19 05:33:53

标签: rust type-inference generic-programming

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

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);
}

这是预期的行为吗?

2 个答案:

答案 0 :(得分:5)

这不是类型推断问题:

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];

答案 1 :(得分:4)

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

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

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

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