【问题标题】:How to resolve this Rust lifetime issue?如何解决这个 Rust 生命周期问题?
【发布时间】:2014-09-20 04:42:31
【问题描述】:

我正在尝试并行读取目录中文件的内容。我遇到了终身问题。

我的代码如下所示:

use std::io::fs;
use std::io;
use std::collections::HashMap;
use std::comm;
use std::io::File;

fn main() {
    let (tx, rx) = comm::channel(); // (Sender, Receiver)
 
    let paths = fs::readdir(&Path::new("resources/tests")).unwrap();
 
    for path in paths.iter() {
        let task_tx = tx.clone();
 
        spawn(proc() {
            match File::open(path).read_to_end() {
                Ok(data) => task_tx.send((path.filename_str().unwrap(), data)),
                Err(e) => fail!("Could not read one of the files! Error: {}", e)
            };
        });
    }
 
    let mut results = HashMap::new();
 
    for _ in range(0, paths.len()) {
        let (filename, data) = rx.recv();
 
        results.insert(filename, data);
    }
 
    println!("{}", results);
}

我得到的编译错误是:

错误:paths 寿命不够长

注意:引用必须在静态生命周期内有效...

注意:...但借用值仅对 7:19 的区块有效

我还尝试在循环中使用into_iter()(或之前的move_iter())但没有取得多大成功。

我怀疑这与生成的任务在整个 main() 范围之外仍然存在有关,但我不知道如何解决这种情况。

【问题讨论】:

    标签: rust


    【解决方案1】:

    错误消息可能有点令人困惑,但它告诉您的是您正在尝试在任务中使用引用 path。 因为 spawn 使用的是proc,所以您只能使用可以将所有权转让给该任务的数据(Send kind)。

    要解决这个问题,您可以这样做(您可以使用 move_iter 但循环后无法访问路径):

    for path in paths.iter() {
        let task_tx = tx.clone();
    
        let p = path.clone();
        spawn(proc() {
            match File::open(&p).read_to_end() {
    

    第二个问题是您试图通过通道发送&str(文件名)。与使用的任务类型相同,必须是Send

        match File::open(&p).read_to_end() {
            Ok(data) => task_tx.send((p.filename_str().unwrap().to_string(), data)),
            Err(e) => fail!("Could not read one of the files! Error: {}", e)
        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-02
      • 2022-11-02
      • 2021-05-31
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      相关资源
      最近更新 更多