rust 有没有一种方法可以隐式绑定let/match操作的成员?[副本]

voase2hg  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(177)

此问题已在此处有答案

Rename enum fields in match (rust)(2个答案)
4小时前关闭
例如,在下面的代码中,ThreeD是一个枚举,可以是Point或Vector。函数***cross***用于计算两个Vectors的叉积,如果其中一个参数是Point,则会死机。
为了计算结果,我需要lhs和rhs的x,y和z分量。然而,照目前的情况,第二匹配将使x、y和z成员从第一匹配中模糊。
一种选择是在第一个let语句之后立即显式地将x、y和z成员分配给临时变量,但这感觉非常糟糕。

pub fn cross(lhs: ThreeD, rhs: ThreeD) -> ThreeD {
    if let Vector { x, y, z } = lhs {
        let lhs_x = x;    // I DON'T LIKE THIS APPROACH!
        let lhs_y = y;    //
        let lhs_z = z;    //

        if let Vector { x, y, z } = rhs {
            // dummy calc here - I know this is wrong ;-)
            Vector { x: lhs_x * x, y: lhs_y * y, z: lhs_z * z }
        } else {
            panic!("Cannot calculate cross product with a point")
        }
    } else {
        panic!("Cannot calculate cross product against a point")
    }
}
nnsrf1az

nnsrf1az1#

您可以使用以下语法绑定到模式中的其他名称:

if let Vector { x: lhs_x, y: lhs_y, z: lhs_z } = lhs {

相关问题