意外的类型推断失败:类型参数的数量错误
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];
在此示例中,编译器无法推断矩阵类型:
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];