我在模式匹配期间遇到过解构结构或枚举。一段时间后,它就习惯了,它成为我最喜欢的 Rust 功能之一。然而,对于新手来说,将结构体的字段解构为单独的变量是非常难以阅读的。以这段代码为例:
#[derive(Debug)]
struct Point {
x: f32,
y: f32,
}
fn main() {
let point = Point { x: 10.3, y: 0.4 };
let Point { x: top_edge, y: left_edge } = point;
println!("{:?}", point);
println!("x: {}, y: {}", top_edge, left_edge);
}
在大多数编程语言中,赋值采用右值并将该值放入左变量中。但在解构情况下,我们引入
let
一个带有字段 Point
的结构 { x: top_edge, y: left_edge }
并将 point
结构变量分配给它。解释这行代码具有挑战性。
与 Python 不同,Rust 中没有多变量赋值。例如,这段代码将无法编译。
let top_edge, left_edge = point.x, point.y;
let top_edge, left_edge = point; // Or even this
相反,可以使用多行代码来分配结构体的字段。
let point = Point { x: 10.3, y: 0.4 };
let top_edge = point.x;
let left_edge = point.y;
println!("{:?}", point);
println!("x: {}, y: {}", top_edge, left_edge);
我个人认为它更具可读性,如果我们计算字符数,那么解构和多行赋值的长度几乎相同。
使用解构相对于多行变量赋值是否有任何性能优势?
在大多数编程语言中,赋值都会采用 right 值,并将该值放入 left 变量中
作业,是的。解构模式,不。模式别名位于左侧,模式目标位于右侧是任何具有解构模式1的编程语言的行为,并且很有意义,因为它允许自然嵌套。参见例如为什么 ECMASCRIPT 6 在解构时反转赋值的两边? JavaScript 中也存在同样的混乱。
Rust 中没有多变量赋值
实际上是有的,自 Rust 1.59.0 起。它只需要元组的括号。它也适用于
let
声明,即
let (top_edge, left_edge) = (point.x, point.y);
我认为它更具可读性,如果我们计算字符数,那么解构和多行赋值的长度几乎相同。
是的,但这也不是 Rust 特有的,在重命名字段时具有解构模式的任何编程语言中都是一样的。然而,更常见的是将字段分配给同名的变量,即
let Point { x, y } = point;
println!("x: {}, y: {}", x, y);
这就是解构的闪光点。
使用解构相对于多行变量赋值是否有任何性能优势?
我真的怀疑是否存在,我希望两者都编译为完全相同的机器代码。
1:……到目前为止我遇到过