无法移出带有作为参数传递的可选成员的借用内容
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 };
}
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;
}
我在基本内存存储解决方案上定义了一个 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 };
}
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;
}