我遇到了以下(简化的)示例:

enum Thing {
    A { value: f32 },
    B { value: f32 },
}


fn main() {

    let mut thing = Thing::A { value: 0. };
    let thing_mut_ref = &mut thing;


    if let Thing::A {value} = thing_mut_ref {
        *thing_mut_ref = Thing::B { value: value * 2.0};
    }   
    
   
}

以下代码无法编译,因为值被捕获为&mut F32,因此不支持乘以2.0.

令我惊讶的是,将ref加到匹配的模式上会突然使其编译,即按值捕获(取消引用value):

enum Thing {
    A { value: f32 },
    B { value: f32 },
}


fn main() {

    let mut thing = Thing::A { value: 0. };
    let thing_mut_ref = &mut thing;


    if let Thing::A {ref value} = thing_mut_ref {
        *thing_mut_ref = Thing::B { value: value * 2.0};
    }   
}

我知道ref通常会做相反的事情--说明我们do not想要通过价值来捕捉.这如何解释这里正在发生的事情?

如有任何帮助,不胜感激!

推荐答案

它实际上不会取消引用,而是将可变引用转换为共享引用. 从documentation of Mul中可以看到,它是针对&f32f32实施的,而不是针对&mut f32实施的

Rust相关问答推荐

重新导出proc宏导致未解决的extern crate错误""

为什么对不可复制数据的引用的取消引用没有O权限来避免Rust中的双重释放?

常量泛型和类型枚举箱有重叠的用途吗?

有没有办法指定只在Rust的测试中有效的断言?

如何删除Mac Tauri上的停靠图标?

用 rust 蚀中的future 展望 struct 的future

在铁 rust 中传递所有权

类型生命周期绑定的目的是什么?

write_buffer 不写入缓冲区而是输出零 WGPU

当推送到 HashMap 中的 Vector 时,类型 `()` 无法取消引用

需要一个有序向量来进行 struct 初始化

Rust 1.70 中未找到 Trait 实现

预期的整数,找到 `&{integer}`

在 RefCell 上borrow

我如何将特征作为 struct 的拥有字段?

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用

Rust - 在线程之间不安全地共享没有互斥量的可变数据

如何断言代码不会在测试中编译?

在 Rust 中组合特征的不同方法是否等效?

为什么当borrow 变量发生变化时,borrow 变量不会改变?