代码之家  ›  专栏  ›  技术社区  ›  Kamil Szot

Rust中的类型错误是什么意思?

  •  4
  • Kamil Szot  · 技术社区  · 8 年前

    我收到此错误:

    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 回复  |  直到 8 年前
        1
  •  6
  •   Shepmaster Tim Diekmann    8 年前

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

    • let _ = ...; 用于忽略表达式的结果(仅当所述结果标记为 #[must_use] 属性)
    • 在类型方面, _ 习惯于 伊莱德 类型(要么是因为您喜欢让编译器推断它,要么是因为编译器判断它无关紧要)

    因此,在您的例子中,编译器省略了类型,因为它无关紧要,所以您可以专注于错误的具体原因。乍一看,这可能会让人困惑,但一旦习惯了它,它实际上就很有用,尤其是当类型多毛(非常大)的时候。


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

    您的原始签名要求: &(u32, u32, Type) 但你通过了 &mut (u32, u32, &mut Type) .

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

        2
  •  4
  •   Chris Emerson    8 年前

    这个 _ 只是一个占位符,可以表示任何内容,有助于澄清错误消息。

    在这种情况下,它表示希望 image::Luma<u8> ,但它实际上找到了一个可变引用( &mut )至 某物 .那东西是什么并不重要;它 &mut <something> 永远无法与之匹敌 image::Luma<i> .

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

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