gpt4 book ai didi

rust - 一个 Rust 函数,用于返回压缩文件行上的迭代器

转载 作者:行者123 更新时间:2023-11-29 08:17:24 27 4
gpt4 key购买 nike

我找到了一个函数的代码,该函数在文本文件的行上返回一个迭代器:

pub fn read_file_iterator(path: &str) -> io::Result<Lines<BufReader<File>>> {
let file = File::open(path)?;
let buf_reader = BufReader::new(file);
// lines() returns an iterator over lines
Ok(buf_reader.lines())
}

对 Rust 零经验,我认为我可以将此代码用于作为 ZIP 存档一部分的文件:

use std::io::prelude::*;
use std::io::{self, BufReader, Lines, Cursor};
use std::path::Path;
use zip::read::ZipFile;

pub fn read_zip_file(_filename: &Path) -> io::Result<Lines<BufReader<ZipFile>>> {
let reader = Cursor::new(std::fs::read(_filename)?);

let mut zip_archive = zip::ZipArchive::new(reader)?;

assert_eq!(1, zip_archive.len());

let zip_file: ZipFile = zip_archive.by_index(0).unwrap(); // E: `zip_archive` is borrowed here"

let buf_reader = BufReader::new(zip_file);

Ok(buf_reader.lines()) // E: returns a value referencing data owned by the current function
}

构建此代码会导致错误(另请参阅反射(reflect)错误详细信息的注释):

cannot return value referencing local variable zip_archive

写这样一个函数的正确方法是什么?

最佳答案

问题是 read_zip_fileread_file_iterator - ZipFile 做的更多 borrows zip_archive 然后超出范围。 ZipFile 没有 ZipArchive 就不存在。正如借用检查员所建议的那样,这是不允许的。

一种方法是将这个特定文件作为临时文件解压缩(就像您的普通 zip 浏览器所做的那样),然后像在您的第一个片段中一样进行迭代。如果文件很小并且您事先知道 - 您最好只收集数据,例如read_to_end ZipFile 实现。

关于rust - 一个 Rust 函数,用于返回压缩文件行上的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58856599/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com