Rust 是否可以使用类型批注进行分解赋值?

Rust 是否可以使用类型批注进行分解赋值?,rust,Rust,总的问题是如何使用类型注释进行嵌套的分解赋值。我将两个f32值相乘,但我不确定如果多次溢出会发生什么。因此,我想将它们指定为f64值,以防止溢出 该示例在示例的“锈蚀”一章中稍加修改 结构点{ x:f32, y:f32, } 结构矩形{ p1:点, p2:点, } fn区域(矩形)->f64{ //这里是我想要类型注释的地方 //执行分解分配时: let矩形{ p1:点{x:x1,y:y1}, p2:点{x:x2,y:y2}, }=rect; ((x2-x1)*(y2-y1)).abs()作为f

总的问题是如何使用类型注释进行嵌套的分解赋值。我将两个
f32
值相乘,但我不确定如果多次溢出会发生什么。因此,我想将它们指定为
f64
值,以防止溢出

该示例在示例的“锈蚀”一章中稍加修改

结构点{
x:f32,
y:f32,
}
结构矩形{
p1:点,
p2:点,
}
fn区域(矩形)->f64{
//这里是我想要类型注释的地方
//执行分解分配时:
let矩形{
p1:点{x:x1,y:y1},
p2:点{x:x2,y:y2},
}=rect;
((x2-x1)*(y2-y1)).abs()作为f64
}

类型分解期间无法执行强制转换。这是因为您无法对要分解的类型中包含的类型进行注释,因此它不取决于您,而是取决于要分解的类型。例如:

struct Point {
    x: f32,
    y: f32,
}
let myOtherPoint = Point { x: 0, y: 0 };
let Point {x, y} = myOtherPoint;
x
y
的类型由类型
点定义。另一方面,这在元组和数组的情况下可以更改:

fn main() {
    let [x, y, z]: [f32; 3] = [1.2, 2.3, 3.4];
    let (x, y, z): (usize, f32, String) = (1, 2.3, "3.4".into());
}
这主要是因为在编写函数签名时元组需要类型注释:

fn foo((a, b, c): (usize, f32, String)) {}
但这只是因为元组本身不是命名类型,所以需要通过注释类型来命名元组。另一方面,
struct
s和
enum
s被命名,因此是可分解的


正文中描述了您的具体问题的解决方案,而不是标题:
使用带有阴影的单独变量以保持可用性。还要注意的是,浮点类型(
f32
f64
)不能溢出(),只能是整数(
[u,i][size,8,16,32,64,128]

fn area(x: Rectangle) -> f64 {
    // Here's where I'd like have type annotations
    // while doing destructuring assignment:
    let Rectangle {
        p1: Point { x: x1, y: y1 },
        p2: Point { x: x2, y: y2 },
    } = rect;

    let (x1, x2, y1, y2) = (x1 as f64, x2 as f64,
                            y1 as f64, y2 as f64);

    ((x2 - x1) * (y2 - y1)).abs()
}