在此示例中,编译器无法推断矩阵类型:
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);
}
这是预期的行为吗?
答案 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];