Rust报错cannot move out of `config.filename` behind shared reference求解
错误触发根源
编译错误完全由run函数内的fs::read_to_string调用逻辑导致:
fs::read_to_string的入参要求为实现AsRef<Path>trait的类型,直接传入config.filename时,会尝试从共享引用&Config指向的结构体中转移filename字段的所有权- Rust借用规则明确禁止从被借用的结构体中移动字段所有权,因此编译器抛出对应错误
修复方案
方案1(推荐,无额外性能开销)
给config.filename加取引用符即可,&String天然实现AsRef<Path>,完全符合fs::read_to_string的入参要求:
pub fn run(config: &Config) -> Result<(), Box<dyn std::error::Error>> { // 仅修改这一行,加&即可 let contents = std::fs::read_to_string(&config.filename)?; for i in search(&config.query, &contents) { println!("Found: {}", i); } Ok(()) }
方案2(有额外字符串拷贝开销,适合需要拿到filename所有权的特殊场景)
调用clone方法复制一份filename的值,避免移动原结构体的字段所有权:
let contents = std::fs::read_to_string(config.filename.clone())?;
注意:你提供的代码片段未导入
std::fs和std::error::Error,实际编译时需要在文件开头补充对应导入声明,或者在调用时写全路径。
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

