【发布时间】:2017-06-10 12:44:23
【问题描述】:
我想编译以下代码:
struct Provider {}
impl Provider {
fn get_string<'a>(&'a self) -> &'a str { "this is a string" }
}
fn main() {
let provider = Provider{};
let mut vec: Vec<&str> = Vec::new();
// PROBLEM: how do I say that this reference s here
// needs to live as long as vec?
let fun = |s: &str| {
vec.push(s);
};
fun(provider.get_string());
}
这是我得到的编译错误:
error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
--> src/main.rs:9:22
|
9 | let mut vec: Vec<&str> = Vec::new();
| ^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the block at 11:24...
--> src/main.rs:11:25
|
11| let fun = |s: &str| {
| ^
note: ...so that reference does not outlive borrowed content
--> src/main.rs:12:18
|
12| vec.push(s);
| ^
note: but, the lifetime must be valid for the block suffix following statement 2 at 13:6...
--> src/main.rs:13:7
|
13| };
| ^
note: ...so that variable is valid at time of its declaration
--> src/main.rs:11:9
|
11| let fun = |s: &str| {
| ^^^
【问题讨论】:
-
呃!这是一个有趣的。有时我真希望我能用
'provider说“那个人的一生,在那里”。 -
不知道如何让它工作。作为一种解决方法,也许您也可以让闭包从环境中捕获 s,而不是将其作为参数传递。喜欢this
-
@Shepmaster 我也发现了这一点。这也是解决实际问题的解决方案 :) 尽管如此,我还是很惊讶无法在此处手动指定
s的类型。