rust - 跨任务和闭包的DuplexStream

  显示原文与译文双语对照的内容
0 0

我的生存期和借用点有问题。 我已经阅读了手动和借用指针教程,但是,。 我还是卡在。

main.rs 草图

fn main() {
 let (db_child, repo_child):(DuplexStream<~str, ~str>, DuplexStream<~str, ~str>) = DuplexStream();
 do spawn {
 slurp_repos(&repo_child);
 }
}

repos.rs 草图

fn slurp_repos(chan: &'static DuplexStream<~str, ~str>) {
. . .
 do request.begin |event| {
. . .
 chan.send(api_url);
 }
}

编译这些模块时,main.rs 有以下错误:

main.rs:21:20: 21:31 error: borrowed value does not live long enough
main.rs:21 slurp_repos(&repo_child);
 ^~~~~~~~~~~
note: borrowed pointer must be valid for the static lifetime...
main.rs:13:10: 1:0 note:.. .but borrowed value is only valid for the block at 13:10
error: aborting due to previous error

我无法确定如何声明我的DuplexStreams生存期 static 。 或者这是slurp_repos函数类型中的错误方法。

如果要查看完整上下文,请执行以下操作:

时间:原作者:6个回答

0 0

我无法测试,但我想解决方案是将 repo_child 流移动到 slurp_repos 中,即:

fn main() {
 let (db_child, repo_child) = DuplexStream();
 do spawn {
 slurp_repos(repo_child);
 }
}
fn slurp_repos(chan: DuplexStream<~str, ~str>) {
. . .
 do request.begin |event| {
. . .
 chan.send(api_url);
 }
}

通过移动整个端点,它允许在任务( 因为 DuplexStreamSend ) 之间传输。 另外,请注意,共享( 引用的用途是什么)的基本双向流( 所以 DuplexStream 才是)的端点并不真正有意义: 电话的每一端只能有一个人。

关于 repo_child的错误消息是因为 slurp_repos 类型需要 'static 换句话说,持续的时间,但 repo_child 绝对不存在: 它是一个函数的局部。

编译器告诉你将 'static 放在 slurp_repos 上的原因是,因为唯一的Send 可以能引用是这个生存期。 这是必需的,因为可以以在借用任务之前使所属任务完成,然后销毁/取消引用引用。

start program/call main
 |
 v
allocate repo_child
 |
 v
spawn -----------------> slurp_repos(chan = &repo_child)
 | |
 v v
finish do things with the chan reference to repo_child
 | |
 v v
deallocate repo_child general work.. .
 |
 v
 do more things with chan: 
 oops, already freed; use-after-free bug
原作者:
...