Rust解构结构参考vs解构结构

以下代码有效

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32
}

fn area(shape: &Rectangle) -> u32 {
    let Rectangle{width, height} = shape;
    width * height
}

fn main() {
    let rec1 = Rectangle {width: 5, height: 10};
    println!("Area {}", area(&rec1));
    println!("Rec {:?}", rec1);
}

但是用&Shape取消引用引用替换对结构的引用*&Shape也有效(例如let Rectangle{width, height} = shape; --> let Rectangle{width, height} = *shape;)。

我不知道为什么两者都有效,在破坏时是否有一些隐含的解除引用?我虽然&Shape引用只指向Shape内存中的位置,而*&ShapeShape本身。widthheight是 的属性struct Rectangle而不是引用&Rectangle

回答

我不知道为什么两者都有效,在破坏时是否有一些隐含的解除引用?

这是 2018 版匹配人体工程学的(方便但令人困惑)结果:在引用类型上进行匹配时,编译器将隐式添加引用和取消引用,因此事情大致正确。

这里发生的area是 thatwidthheightare &u32not u32,编译器有效地将您的代码解释为:

let &Rectangle{ ref width, ref height } = shape;

如果你没有使用像 rust-analyzer 这样可以直接在你的编辑器中显示这些信息的东西,一个常见的技巧是写这样的东西:

let x: () = var

编译错误会告诉你类型var是什么(除非它是())。

我虽然 &Shape 引用仅指向 Shape 在内存中的位置,而 *&Shape 是 Shape 本身。

这是真的,但是在模式的上下文中并不一定意味着结构被移动。这里因为 的字段Rectangle都是Copy编译器可以解构“拥有的”结构而无需移动它,它可以只复制字段。这本质上是一个简单的属性访问会做的(shape.widthu32)。


以上是Rust解构结构参考vs解构结构的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>