Programmer en Scala 3 : Mutabilité et boucles

Par Raphaël Fromentin
Le (Dernière mise à jour le )
Tags : langages scala

Précédemment : Booléens et conditions

La mutabilité

Nous avons vu précédemment un moyen de stocker des valeurs sous un nom grâce aux variables. Cependant, nous n’avons jusqu’à présent qu’utilisé des variables dites “immuables”, que l’on ne peut modifier. Vous avez peut-être tenté de faire la chose suivante :

val x = 1
x = 3

en obtenant une erreur :

-- [E052] Type Error: ----------------------------------------------------------
1 |x = 3
  |^^^^^
  |Reassignment to val x
  |
  | longer explanation available when compiling with `-explain`

Pourtant, pouvoir changer la valeur d’une variable est parfois bien utile ! Par exemple le nombre de vies de Mario change quand il meurt ou ramasse 100 pièces. Son état (grand, petit, Mario de feu…) change également.

Nous pouvons le faire en Scala en utilisant un autre mot clé : var. À l’instar de val, var permet de déclarer une variable à la différence près que la valeur de celle-ci peut-être changée.

var x = 1
x = 3

println(x) //3

Bien sûr, il est possible de combiner cette fonctionnalité avec les autres vues précédemment :

var vies = 1
vies = vies + 1 //+1 Up !

println(vies) //2

Le langage propose aussi quelques contractions comme :

Contracté Non-contracté
x += y x = x + y
x -= y x = x - y
x *= y x = x * y
x /= y x = x / y

Ainsi, le code ci-dessus peut s’abréger en :

var vies = 1
vies += 1

println(vies) //Toujours 2

Note : en Scala et dans d’autres langages, on préfère utiliser val par défaut pour ne pas se soucier d’un potentiel changement de valeur. On utilise alors var uniquement en cas de besoin.

Les boucles

Reprenons l’exemple de notre jeu Mario. Nous avons parfois besoin d’exécuter une même action plusieurs fois :

En Scala, ces répétitions peuvent être décrites en utilisant les boucles. Il en existe deux types.

La boucle while

En anglais, “while” peut se traduire en “alors que”/”tant que”. La boucle while répète une action tant qu’une condition (représentée par un booléen) est satisfaite.

Elle se présente sous cette forme :

while condition do
  action

À titre d’exemple, faisons un petit décompte avec cette boucle :

var restant = 5
while restant > 0 do
  println(restant)
  restant -= 1

println("Fin du temps")

Sortie :

5
4
3
2
1
Fin du temps

println(restant)

La boucle for

En anglais, “for” veut dire “pour”… Ça ne nous aide pas ! La boucle for peut-être utilisée pour répéter une action n fois. Le code suivant aura la même sortie que notre précédent exemple :

for restant <- 5 until 0 do
  println(restant)

println("Fin du temps")

Ici, restant va prendre à la première itération (“tour de boucle”) la valeur 5, puis 4 pour la seconde itération, puis 3, … jusqu’à 1. 5 until 0 veut dire “de 5 jusqu’à 0 exclus”

Dans le cas des boules de feu de Mario, nous pouvons écrire le code suivant :

//Le nombre de rebonds que peut faire une boule de feu
val rebonds = 3

for i <- 0 until rebonds do
  val rebondActuel = i + 1
  println(rebondActuel + " rebonds effectués")

println("La boule de feu a disparu")

Sortie :

1 rebonds effectués
2 rebonds effectués
3 rebonds effectués
La boule de feu a disparu

Note : en réalité, la boucle for en Scala est plus puissante que ça mais nous en reparlerons plus tard.

Conclusion

Nous avons aujourd’hui vu comment répéter une action un certain nombre de fois ou selon une condition. Les boucles et les conditions sont à la base de la plupart des langages de programmation.

Nous verrons d’autres utilisations de la boucle for dans un prochain article ainsi qu’un projet pour mettre en œuvre les notions que nous avons précédemment vues.