我正在使用一个带有返回盒式迭代器的方法的特质。由于迭代器将使用self
和foo
的参数,所有这些都受到相同生命周期的约束:
pub trait Foo {
fn foo<'a>(&'a self, txt: &'a str) -> Box<Iterator<Item = String> + 'a>;
}
我想围绕这个方法构建一个函数:
fn foo_int<'a, F: Foo>(f: &'a F, val: i32) -> impl Iterator<Item = String> + 'a {
let txt = format!("{}", val);
f.foo(&txt)
}
但是这段代码无法编译,因为:
error[E0515]: cannot return value referencing local variable `txt`
--> src/lib.rs:7:5
|
7 | f.foo(&txt)
| ^^^^^^----^
| | |
| | `txt` is borrowed here
| returns a value referencing data owned by the current function
我理解为什么会发生这种情况,这很合理,但似乎应该有一种方法来避免它。毕竟,这就是闭包(使用“move”关键字)所做的事情:它们拥有它们需要“带走”的值的所有权。
是否有一种聪明的方法可以使用闭包或其他东西重写“foo_int”函数?
foo
方法对str
做了什么?如果它需要一个与f
一样长寿命的字符串,那么接受String
而不是&str
是否更有意义? - loganfsmythtxt
的生命周期与self
一样长,那么在foo_int
内部创建一个新字符串并使其满足该生命周期是不可能的。根据定义,f
在调用foo_int
时已经存在,因此在foo_int
中无法做任何事情来创建具有该生命周期的内容。 - loganfsmyth&str
就是一个&'static str
。 - loganfsmyth