La réponse de Daniel résume bien la bonne façon de le faire, ainsi que la raison pour laquelle cela fonctionne. Comme il a déjà couvert cet angle, je vais essayer de répondre à votre question plus large (concernant la conception du langage) ...
Dans la mesure du possible, Scala s'efforce d'éviter d'ajouter des fonctionnalités de langage en faveur de la manipulation des choses à travers les mécanismes existants. Par exemple, Scala n'inclut pas d'instruction break
. Cependant, il est presque trivial de rouler un de vos propres comme une bibliothèque:
case object BreakException extends RuntimeException
def break = throw BreakException
def breakable(body: =>Unit) = try {
body
} catch {
case BreakException =>()
}
Ceci peut être utilisé de la manière suivante:
breakable {
while (true) {
if (atTheEnd) {
break
}
// do something normally
}
}
(Note: ceci est inclus dans la bibliothèque standard pour Scala 2.8)
Les syntaxes d'affectations multiples telles que celles autorisées par des langages tels que Ruby (par exemple x = 1, y = 2, z = 3
) entrent dans la catégorie de "syntaxe redondante". Lorsque Scala dispose déjà d'une fonctionnalité qui active un motif particulier, elle évite d'ajouter une nouvelle fonctionnalité uniquement pour gérer un cas particulier de ce modèle. Dans ce cas, Scala a déjà une correspondance de motif (une caractéristique générale) qui peut être utilisée pour gérer plusieurs affectations (en utilisant l'astuce de tuple décrite dans d'autres réponses). Il n'est pas nécessaire de gérer ce cas particulier de manière séparée.
Sur un plan légèrement différent, il convient de noter que la syntaxe d'assignation multiple de C (et donc de Java) est également un cas particulier d'une autre caractéristique plus générale. Tenir compte:
int x = y = z = 1;
Ce exploite le fait que l'affectation retourne la valeur attribuée dans les langues C-dérivé (ainsi que le fait que la cession est droit associatif). Ce n'est pas le cas chez Scala. Dans Scala, l'affectation renvoie Unit
. Bien que cela présente quelques inconvénients gênants, il est plus théoriquement valable car il souligne la nature de l'assignation directement dans son type.
Il convient de noter que 'val (a, b, c) = (1, 2, 3)' ne semble être l'expression généralement acceptée pour l'attribution multiple, préférable de séparer les instructions d'affectation. Au moins, cela a été mon impression à travers le code développé par la communauté. –
Il est également intéressant de noter que vous pouvez définir plusieurs vals à la même valeur avec les valeurs intuitives "val x, y, z = 42". –
Il y a aussi 'val seq @ Seq (a, b, c) = Seq (1,2,3)' qui non seulement définit les valeurs 'a',' b' et 'c', mais aussi la seqeunce' seq '! – Mullefa