跨任务和闭包的DuplexStream

时间:2013-07-24 05:45:13

标签: rust

我遇到lifetimes问题并借了点数。我已经阅读了手册并借用了指针教程,但是......我仍然被卡住了。

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生命周期是静态的。或者这可能是错误的方式进入slurp_repos的函数类型。

如果您想查看完整的上下文:

1 个答案:

答案 0 :(得分:1)

我无法测试,但我想解决方案是将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);
    }
}

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

关于repo_child生存时间不够长的错误消息是因为slurp_repos的类型需要'static的内容,即持续整个程序生命周期,但是{{1}绝对不会:它是函数的本地。

编译器告诉您将repo_child放在'static上的原因是因为唯一slurp_repos能够引用的是具有此生命周期的引用。这个限制是必需的,因为您可以在借用任务之前完成拥有任务,然后销毁/取消分配引用,留下悬空指针;在图表中:

Send