Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

lifetime issues with `axis_iter`

未關閉
#1,073 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

評估

難度
4/5
預估耗時
3-5 天
新手友好度
25/100
Issue 類型
缺陷
描述清晰度
需要釐清
活躍度
停滯
技術堆疊
rust
領域
data

研究方向

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.

由索引模型根據 Issue 內容生成。

描述

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

主要語言
Rust
星號
4.3k
分支
391
PR 合併指標
30 天內沒有已合併 PR

貢獻指南

這個儲存庫沒有索引到貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

rust-ndarray/ndarray 的其他 Issue

查看 rust-ndarray/ndarray 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。