2
impl Rate for Vec<VolumeRanged> {
fn costs<'a, I>(&'a self, issues: &I, period: u32) -> Box<'a + Iterator<Item = f32>>
where
I: IntoIterator<Item=f32>,
I::IntoIter: 'a
{
fn issue_cost(issue: f32, percentage: f32, constant: f32, max: f32) -> f32 {
let r = issue * percentage/100.0 + constant;
match r.partial_cmp(&max) {
Some(Less) => r,
_ => max
}
}
Box::new(issues.into_iter().map(|i| {
let (pr, nr) = pairwise(self)
.find(|&(_, n)| in_range(&i, &n.range))
.expect("No range found");
issue_cost(
i,
nr.percentage,
pr.map_or(0.0, |x| x.max),
nr.max,
)
}))
}
}
error[E0373]: closure may outlive the current function, but it borrows `self`, which is owned by the current function
--> src/main.rs:43:41
|
43 | Box::new(issues.into_iter().map(|i| {
| ^^^ may outlive borrowed value `self`
44 | let (pr, nr) = pairwise(self)
| ---- `self` is borrowed here
|
help: to force the closure to take ownership of `self` (and any other referenced variables), use the `move` keyword
|
43 | Box::new(issues.into_iter().map(move |i| {
| ^
を言っているしかし、私は閉鎖に所有権を移動する必要はありません。私が望むのは、返されたボックスイテレータは、
self
と
issues
の両方の長さで生きていなければならないということです。彼らが離れるとすぐに、それはなくなるはずです。
これは、複製されたイテレータを参照の代わりにissues
に渡すことで解決できることを知っていますが、ここでは必要ないと思います。
私はすでに私がそれをしたくない理由を言ったと思います。 – user1685095
「問題」と「自己」の間に生きていなければならない閉鎖です。 – user1685095
ライフタイムアノテーションは実際のライフタイムを変更しません。 'move'を追加すると、割り当てられていないベクトルへの参照ができなくなります。クロージャが関数内でのみ存在する関数パラメータ 'self'を参照するため、' move'を追加しないとプログラムをコンパイルできません。 – red75prime