La propriété

Ces exercices portent sur la liaison et le déplacement (move), les emprunts partagés (&) et mutables (&mut) et le déréférencement (*). Faites-les dans l'ordre.

Somme sans consommer

Calculer la somme des éléments d'un vecteur sans en prendre la propriété : après l'appel, le vecteur doit toujours être utilisable par l'appelant.

  • Objectif : &[i32] en argument, for sur des références.
  • Signature suggérée : fn somme(v: &[i32]) -> i32.
  • Cas de test : somme(&vec![1, 2, 3, 4]) -> 10, somme(&[]) -> 0.

Doubler en place

Multiplier par 2 chaque élément d'un vecteur, en le modifiant sur place.

  • Objectif : &mut [i32], for x in v.iter_mut(), *x.
  • Signature suggérée : fn doubler(v: &mut [i32]).
  • Cas de test : après doubler(&mut v) avec v = [1, 2, 3], v == [2, 4, 6].

Échanger deux entiers

Échanger les valeurs pointées par deux références mutables, sans utiliser std::mem::swap.

  • Objectif : &mut i32, déréférencement *, variable temporaire.
  • Signature suggérée : fn echanger(a: &mut i32, b: &mut i32).
  • Cas de test : après echanger(&mut x, &mut y) avec x = 1, y = 2, on a x == 2 && y == 1.

Corriger le code

On te donne un extrait qui ne compile pas : une valeur y est utilisée après avoir été déplacée. Corrige-le sans supprimer de ligne (indice : un emprunt, ou un .clone()).

  • Objectif : lire un message d'erreur du borrow checker, choisir entre & et .clone().
  • Signature suggérée : -
  • Cas de test : le code compile et affiche deux fois la même valeur.

Compter les pairs

Compter combien d'éléments d'un vecteur sont pairs, sans consommer le vecteur.

  • Objectif : &[i32], for, %, compteur mut.
  • Signature suggérée : fn nb_pairs(v: &[i32]) -> usize.
  • Cas de test : nb_pairs(&[1, 2, 3, 4, 6]) -> 3, nb_pairs(&[1, 3, 5]) -> 0.