【发布时间】:2018-05-29 00:10:21
【问题描述】:
我正在尝试使用retain(...) 方法从向量中过滤掉值。就目前而言,到目前为止,我的代码是
let results = get_data(); // Returns Result<Vec<MyData>, Box<Error>>
match results {
Ok(mut my_data) => {
// Make sure that `name` is not None
myData.retain(|ref d| d.name.is_some());
// Only keep data if 'name' is in this list
let names = ["Alice", "Bob", "Claire"];
my_data.retain(|ref d| names.contains(d.name.unwrap().as_str()));
},
Err(_) => {}
}
但是,这会产生错误
|
| my_data.retain(|ref d| names.contains(d.name.unwrap().as_str()));
| ^^^^^^^^^^^^^^^^^^^^^^^^ expected &str, found str
|
= note: expected type `&&str`
found type `&str`
编译器似乎在这里告诉我两件不同的事情,但在这两种情况下,它似乎都需要额外的参考。但是,当我尝试将相关行更改为&names.contains(d.name.unwrap().as_str()) 时,编译器会抛出以下错误。
|
| my_data.retain(|ref d| names.contains(&d.name.unwrap().as_str()));
| ^ cannot move out of borrowed content
如何检查String(我认为这就是name.unwrap() 的类型)是否包含在names 向量中?
【问题讨论】:
-
请包含错误的上下文,以便我们知道它指向的位置。
-
请查看如何创建minimal reproducible example,然后查看edit 您的问题以包含它。我们无法分辨代码中存在哪些 crate、类型、特征、字段等。理想情况下,在Rust Playground 上生成可以重现您的错误的内容。尽可能减少你的代码——你需要返回一个
Result吗?你需要一个自定义结构吗,你需要有多个retain语句等等。你的代码没有意义:你说你有一个Result,但您的match语句使用Result::Ok和Option::None。 -
Idiomatic Rust 使用
snake_case表示变量、方法、宏和字段,使用UpperCamelCase表示类型。请改用my_data。