【问题标题】:Rust moving value into both sides of map_or_else?Rust 将值移动到 map_or_else 的两侧?
【发布时间】:2021-11-09 10:00:07
【问题描述】:

Rust 有一个 method on an enum called .map_or_else(),它需要两个闭包,其中一个在 None 上触发,另一个在 Some(inner) 上触发,传递 inner

这很好,但我想做的是将一个值移动到它的两个分支中。这会产生错误,

error[E0382]: borrow of moved value: `result`
   --> src/sequence/renderer.rs:124:5
    |
104 |         let result = match self.display {
    |             ------ move occurs because `result` has type `String`, which does not implement the `Copy` trait
...
123 |                 || Ok(result),
    |                 --    ------ variable moved due to use in closure
    |                 |
    |                 value moved into closure here
124 |                 |v| Ok(format!("{:0>width$}", result.clone(), width=v as usize ))
    |                 ^^^                           ------ borrow occurs due to use in closure
    |                 |
    |                 value borrowed here after move)

这个错误可以通过将.map_or_else的第一个闭包替换为,

Ok(result.clone())

但这是个好主意吗?那我必须clone()一个字符串没有好处?当双方都需要访问同一个变量时,使用.map_or_else() 的惯用方式是什么?

【问题讨论】:

  • format! 不需要拥有值:借来的值也可以工作(无论如何它自己分配一个新的String)。但是你最好还是进入第一个闭包,这样观察在这里实际上并没有帮助。

标签: rust closures higher-order-functions borrow-checker


【解决方案1】:

不幸的是,这无法正常工作,因为 Rust 无法将两个闭包注释为“只有一个会被调用”。

所以最好的办法是不使用更高级别的函数,而是编写一个简单的匹配表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多