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内存中的位置,而*&Shape它Shape本身。width和height是 的属性struct Rectangle而不是引用&Rectangle。
回答
我不知道为什么两者都有效,在破坏时是否有一些隐含的解除引用?
这是 2018 版匹配人体工程学的(方便但令人困惑)结果:在引用类型上进行匹配时,编译器将隐式添加引用和取消引用,因此事情大致正确。
这里发生的area是 thatwidth和heightare &u32not u32,编译器有效地将您的代码解释为:
let &Rectangle{ ref width, ref height } = shape;
如果你没有使用像 rust-analyzer 这样可以直接在你的编辑器中显示这些信息的东西,一个常见的技巧是写这样的东西:
let x: () = var
编译错误会告诉你类型var是什么(除非它是())。
我虽然 &Shape 引用仅指向 Shape 在内存中的位置,而 *&Shape 是 Shape 本身。
这是真的,但是在模式的上下文中并不一定意味着结构被移动。这里因为 的字段Rectangle都是Copy编译器可以解构“拥有的”结构而无需移动它,它可以只复制字段。这本质上是一个简单的属性访问会做的(shape.width是u32)。