lifetime issues with `axis_iter`

Ouverte
#1,073 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
25/100
Type d'issue
Bug
Clarté
À clarifier
Activité
À l'abandon
Stack technique
rust
Domaine
data

Piste de recherche

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.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

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

Langage dominant
Rust
Étoiles
4.3k
Forks
391
Métriques de merge des PR
Aucune PR mergée en 30 j

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de rust-ndarray/ndarray

Toutes les issues de rust-ndarray/ndarray

Issues similaires

Plus d'issues Rust

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.