我遇到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的函数类型。
如果您想查看完整的上下文:
答案 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