如何解决scannot bind by-move into a pattern guard [E0008]的问题?

let res = match Some("hi".to_string()) {
    Some(s) if s.len() == 0 => 1,
    _ => 3
};

有没有办法在不给手臂造成伤害的情况下改变它?

推荐答案

在这种情况下,可以通过引用绑定:

let res = match Some("hi".to_string()) {
    Some(ref s) if s.len() == 0 => 1,
    _ => 3
};

这里的一般问题是,通过move绑定必须禁止进一步使用原始变量,因为移出会使数据无效.如果guard为false,则需要使用原始变量来匹配后面的模式,因为移动是非法的.

例如:

fn f(x: Option<String>) {
    match x {
        Some(a) if { drop(a); false } => println!("impossible"),
        Some(b) => println!("whoops, {}", b),
        None => println!("none"),
    }
}

如果xSome,则在决定是否应采用a臂时,内部String被移出并解除分配,但一旦a臂被拒绝,该String立即再次用于b臂.

Rust相关问答推荐

生成的future 的 struct 是什么?

if let声明中临时对象的生存期

有没有方法处理rust中嵌套的ok_or()?

通过使用光标拖动角来绕其中心旋转矩形

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

在UdpSocket上使用sendto时的隐式套接字绑定

无法将记录器向下转换回原始 struct

在rust sqlx中使用ilike和push bind

我如何制作一个变异迭代器来锁定内部数据直到删除?

在文件链实施中绕过borrow 判断器

循环访问枚举中的不同集合

为什么`str`类型可以是任意大小(未知大小),而`string`类型的大小应该是已知的?

在Rust中克隆源自INTO_ITER()的迭代器的成本?

要求类型参数有特定的大小?

将泛型中的 Box 转换为 rust 中的 Box

使用 Rust 从 Raspberry Pi Pico 上的 SPI 读取值

Rust Serde 为 Option:: 创建反序列化器

不能将 `*self` borrow 为不可变的,因为它也被borrow 为可变的 - 编译器真的需要如此严格吗?

将原始可变指针传递给 C FFI 后出现意外值

为什么在 rust 中删除 vec 之前应该删除元素