rust 如何解决“使用移动的值”,“值移动到这里,在循环的上一次迭代中”?[重复]

j9per5c4  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(201)

此问题在此处已有答案

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而不是传递它?

wribegjk

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

相关问题