无法移出带有作为参数传递的可选成员的借用内容

Cannot move out of borrowed content with optional members passed as argument

我在基本内存存储解决方案上定义了一个 find 函数。我正在尝试通过创建一个名为 SearchOpts:

struct 来找到一种灵活传递条件搜索选项的方法
trait HasRecords {
    fn find(&self, opts: &SearchOpts) -> ();
}

pub struct SearchOpts {
    sensorId: Option<String>,
}

struct MemDb {
    id: u32,
}

impl HasRecords for MemDb {
    fn find(&self, opts: &SearchOpts) -> () {
        println!("Hello {}", opts.sensorId.unwrap());
    }
}

fn main() {
    let _x = MemDb { id: 42 };
}

playground

error[E0507]: cannot move out of borrowed content
  --> src/main.rs:15:30
   |
15 |         println!("Hello {}", opts.sensorId.unwrap());
   |                              ^^^^ cannot move out of borrowed content

我不知道这是否是实现此类功能的最佳方式,但我也不明白在这种情况下如何取悦借阅检查器(这是我想学习的东西)第一个)。

关键是因为你在你的函数中只有对 SearchOpts 结构的引用,所以你不能移出它。

查看 definition of Option::unwrap:

pub fn unwrap(self) -> T

它按值接受 Option 参数,因此它会移出结构。不好!解决这个问题的关键是 Option::as_ref:

pub fn as_ref(&self) -> Option<&T>

正如签名所暗示的那样,它将 &Option<T> 转换为 Option<&T>。后一种类型可以在不移动任何东西的情况下展开(导致 &T)。所以你可以这样写:

if opts.sensorId.is_some() && &d.sensorId != opts.sensorId.as_ref().unwrap() {
     return false;
}

不过,我会这样写:

if opts.sensorId.as_ref().map_or(false, |id| id != &d.sensorId) {
    return false;
}