_在Rust中的类型错误中意味着什么?

时间:2016-06-20 14:33:51

标签: rust

我收到了这个错误:

error: mismatched types [E0308]
                         process(s);
                                 ^
help: run `rustc --explain E0308` to see a detailed explanation
note: expected type `&(u32, u32, image::Luma<u8>)`
note:    found type `&mut (u32, u32, &mut _)`

但我不明白_的含义。

2 个答案:

答案 0 :(得分:4)

_只是一个可能意味着什么的占位符,并有助于澄清错误消息。

在这种情况下,它说它期待image::Luma<u8>,但实际上它找到了一个可变引用(&mut)到某些东西。什么东西都没关系;它&mut <something>永远无法与image::Luma<i>匹配。

如果相反它说...found type &mut (u32, u32, &mut T: SomeTrait)或类似,我认为放大眼前的问题会更难。

您无法将引用传递给需要复制(或移动)的完整对象的函数。

答案 1 :(得分:4)

在Rust中,当名称无关紧要时,使用_标识符。这种情况发生在以下几种情况:

  • let _ = ...;用于忽略表达式的结果(仅当所述结果标有#[must_use]属性时才有必要)
  • 在类型中,_用于 elide 类型(要么是因为您希望让编译器推断它,要么因为编译器判断它无关紧要)

因此,在您的情况下,编译器已经省略了类型,因为它无关紧要,因此您可以专注于错误的具体原因。一开始可能会让人感到困惑,但是一旦习惯了,它实际上很有帮助,特别是当类型有毛的时候(非常大)。

错误很简单:你误解了引用和值。

您的原始签名期望:&(u32, u32, Type)但您通过了&mut (u32, u32, &mut Type)

可变性的差异并不重要(在这个方向上),但是&mut TypeType具有非常不同的内存结构并且不可互换。