此问题在此处已有答案:
What do I have to do to solve a "use of moved value" error?(3个答案)
上个月关门了。
我想用 * 炉甘石 * 读取excel文件。首先,通过工作簿获取工作表名称,然后迭代所有工作表以读取其内容。但是,在for中将工作簿传递给handle_sheet时出错。
源代码:
use std::{fs::File, io::BufReader};
use calamine::{open_workbook_auto, DataType, Reader, Sheets};
pub fn read_to_workbook(filename: String) {
let workbook = open_workbook_auto(filename).expect("Cannot open file");
let sheets = workbook.sheet_names().to_owned();
for sheet_name in &sheets {
handle_sheet(sheet_name.to_string(), workbook);
}
}
fn handle_sheet(sheet_name: String, mut workbook: Sheets<BufReader<File>>) {
if let Some(Ok(range)) = workbook.worksheet_range(&sheet_name) {
// ..do something
}
}
字符串
错误:error[E0382]: use of moved value: workbook
我是Rust的新手,非常感谢。
我应该在handle_sheet中使用引用workbook,还是将workbook克隆传递给handle_sheet,或者在handle_sheet中创建一个新的workbook而不是传递它?
1条答案
按热度按时间wribegjk1#
在Rust中,当传递参数时,所有权被移动。因此,在循环的第一次迭代后,您的
workbook
将不再可访问,编译器将抱怨。有关更多信息,请参阅https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html传递第一个参数是没有问题的,因为每次迭代都用
to_string()
创建一个新的String
。您可以通过将
workbook
作为可变引用传递或通过克隆来解决问题。要作为可变引用传递,请在调用
handle_sheet
时使用&mut workbook
而不是workbook
。如果
workbook
是可克隆的,那么在调用该函数时也可以使用workbook.clone()
。参见:https://doc.rust-lang.org/std/clone/index.html你可能还想看看this similar question。