1

find在基本的内存存储解决方案上定义了一个函数。我试图通过创建一个struct被调用的方法来灵活地传递条件搜索选项SearchOpts

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 };
}

操场

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

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

4

1 回答 1

1

关键是,由于您在函数中只有对SearchOpts结构的引用,因此您无法移出它。

查看 的定义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;
}
于 2018-07-03T22:03:28.920 回答