lifetime issues with `axis_iter`
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 25/100
Research direction
Start with src/lib.rs around lines 66-85 and the axis_iter_mut(...).reduce(scan) call, then compare it with the manual loop and the ArrayViewMutD/Zip closure. Reproduce the reported compiler error and determine whether this lifetime pattern is supported; done means a documented explanation or a confirmed actionable fix.
Written by the indexing model from the issue text.
Description
Hello, that's me again. I apologize for my likely dump questions.
I'm in a situation where I want to process an array slice by slice, where each slice is computed in term of the previous. And my issue is that I cannot achieve this using .reduce instead of a for-loop.
This works:
// iterate slices
let mut it = array.axis_iter_mut(Axis(i));
let mut last = it.next().unwrap();
for mut current in it {
// compute 'current' slice in term of the previous 'last' slice
Zip::from(last).and(&mut current)
.for_each(|l, c| {
*c = /* some expression in term of `l` */;
});
last = current;
}
But the following doesn't work, though it should be more idiomatic:
// compute 'current' slice in term of the previous 'last' slice
let scan = |last: ArrayViewMutD<T>, mut current: ArrayViewMutD<T>| {
Zip::from(last).and(&mut current)
.for_each(|l, c| {
*c = /* some expression in term of `l` */;
});
current
};
// iterate slices
array.axis_iter_mut(Axis(i)).reduce(scan);
compiler output is
error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src/lib.rs:85:10
|
85 | array.axis_iter_mut(Axis(i)).reduce(scan);
| ^^^^^^^^^^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime defined on the function body at 66:15...
--> src/lib.rs:66:15
|
66 | mut array: ArrayViewMutD<T>,
| ^^^^^^^^^^^^^^^^
note: ...so that the type `ArrayBase<ViewRepr<&mut T>, ndarray::Dim<IxDynImpl>>` is not borrowed for too long
--> src/lib.rs:85:4
|
85 | array.axis_iter_mut(Axis(i)).reduce(scan);
| ^^^^^
note: but, the lifetime must be valid for the anonymous lifetime #2 defined on the body at 76:16...
--> src/lib.rs:76:16
|
76 | let scan = |last: ArrayViewMutD<T>, mut current: ArrayViewMutD<T>| {
| _________________________^
77 | | let incr = ramp[i];
78 | | Zip::from(last).and(&mut current)
79 | | // .into_par_iter()
... |
83 | | current
84 | | };
| |_____________^
note: ...so that the types are compatible
--> src/lib.rs:85:33
|
85 | array.axis_iter_mut(Axis(i)).reduce(scan);
| ^^^^^^
= note: expected `ArrayBase<ViewRepr<&mut T>, _>`
found `ArrayBase<ViewRepr<&mut T>, _>`
I suspect this comes from the fact axis_iter doesn't provide elements with lifetime 'a (same as the original array) but instead provide an anonymous lifetime '_ ?
Not a big issue in my program since I found the first code sample to avoid my issue, but I'm curious :)
Thanks in advance
- Dominant language
- Rust
- Stars
- 4.3k
- Forks
- 391
- PR merge metrics
- No merged PRs in 30d
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from rust-ndarray/ndarray
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
rust-ndarray/ndarray#1612 · 1 comment ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
rust-ndarray/ndarray#1617 · 1 comment ·
-
bug good first issue
Difficulty 3/5 1-2 days Newbie friendliness 68/100
rust-ndarray/ndarray#1615 · 1 comment ·
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
rust-ndarray/ndarray#1610 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 72/100
rust-ndarray/ndarray#1609 ·
All issues in rust-ndarray/ndarray
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
kwakseongjae/auto-hwp#319 ·
-
area:cli bug filter-quality good first issue priority:medium
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
-
Difficulty 1/5 Under an hour Newbie friendliness 72/100
bevyengine/bevy#25861 ·
-
comp-datalake
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
ClickHouse/ClickHouse#121222 ·
-
enhancement remote
Difficulty 2/5 1-3 hours Newbie friendliness 68/100