如何解决此生锈问题?

我想读取并行目录中的文件的内容。我遇到了终生问题。如何解决此生锈问题?

我的代码如下所示:

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);

}

我得到的编译错误是:

error: paths does not live long enough

note: reference must be valid for the static lifetime...

note: ...but borrowed value is only valid for the block at 7:19

我也试过在循环使用into_iter()(或move_iter()之前)没有成功。

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

回答:

错误消息可能有点令人困惑,但它告诉你的是,你正试图在任务中使用参考path。 由于spawn使用的是proc,因此您只能使用可以将所有权转让给该任务的数据(Send类型)。

要解决,你可以做到这一点(你可以使用一个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)

};

以上是 如何解决此生锈问题? 的全部内容, 来源链接: utcz.com/qa/260341.html

回到顶部