我收到了这个错误:
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 _)`
但我不明白_
的含义。
答案 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 Type
和Type
具有非常不同的内存结构并且不可互换。