【问题标题】:Unexpected type inference failure: wrong number of type arguments意外的类型推断失败:类型参数的数量错误
【发布时间】:2016-05-19 05:33:53
【问题描述】:

在这个例子中,编译器无法推断出矩阵类型:

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

这是意料之中的行为吗?

【问题讨论】:

    标签: rust type-inference generic-programming


    【解决方案1】:

    这不是类型推断问题:

    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&lt;f32&gt; 是从中出来的华夫饼。如果您得到华夫饼铁(当然上面放着枫糖浆),您可能会失望!

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


    您可以提供一个虚拟参数 (_),它将被推断:

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

    【讨论】:

    • 我喜欢你的华夫饼例子。 :D
    【解决方案2】:

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

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

    或者,您可以添加一个默认类型参数,这样当 T 类型正好是 f32 时,您可以省略 &lt;…&gt;(但这不是类型推断,您仍然需要显式编写 Mat4x4&lt;f64&gt;)。

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

    【讨论】:

    • 在大多数情况下,您不需要使用“_”进行推理,这是预期的吗?
    • @HosseinNoroozpour:你的意思是当你推断出整个类型时,例如let m = [0.4f32; 16];?但是在这里,您将其限制为 Mat4x4&lt;T&gt;
    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多