rust - 由于过滤 read_dir 输出,如何解决“无法移出借来的内容”?
问题描述
我正在尝试使用read_dir
来读取目录的内容,然后仅过滤文件:
let xs = std::fs::read_dir(".")?
.filter(|r_entry| {
r_entry.and_then(|entry| {
let m = entry.metadata()?;
Ok(m.is_file())
})
.unwrap_or(false)
})
.collect::<Result<Vec<_>>>();
(操场)
错误信息是:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:6:13
|
6 | r_entry
| ^^^^^^^ cannot move out of borrowed content
我尝试了各种组合&
和*
周围r_entry
无济于事。怎么了?
解决方案
中的谓词filter
只允许你借用r_entry
。当您调用 时and_then
,这会尝试移动。相反,您可以像这样使用引用match
:
fn main() -> Result<()> {
let xs = std::fs::read_dir(".")?
.filter(|r_entry| match r_entry {
Ok(entry) => entry.metadata().map(|m| m.is_file()).unwrap_or(false),
Err(_) => false,
})
.collect::<Result<Vec<_>>>();
println!("{:?}", xs);
Ok(())
}
推荐阅读
- c# - 服务执行期间的ServiceStack操作顺序问题
- java - 如何将列表中的项目复制到另一个活动的列表中?
- javascript - 如何将文字参数传递给包含的js?
- c# - 流对象列表作为来自 API 的文件
- java - 无法摆脱错误:意外隐式转换为“TextInputLayout”:布局标记为“EditText”
- reactjs - 如何在 React.js Typescript 版本中使用不支持 typescript 的 javascript 包
- c# - 如何使用 mapster 覆盖默认映射
- docker - Hyperledger Fabric:在不同的物理机器上设置相同组织的两个对等点
- mysql - 在 Ubuntu 服务器上设置 LAMP 网站速度慢
- c# - C#如何拥有稳定的SendKeys函数