在 Rust 中解构结构是否比多行变量赋值更快?

问题描述 投票:0回答:1

我在模式匹配期间遇到过解构结构或枚举。一段时间后,它就习惯了,它成为我最喜欢的 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);

我个人认为它更具可读性,如果我们计算字符数,那么解构和多行赋值的长度几乎相同。

使用解构相对于多行变量赋值是否有任何性能优势?

rust destructuring
1个回答
1
投票

在大多数编程语言中,赋值都会采用 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:……到目前为止我遇到过

© www.soinside.com 2019 - 2024. All rights reserved.