2010-07-25 7 views
1

Je veux faire:affectation de pont Perform dans scala

var (a, b) = (0, 0) 
a = (b = 100) 

mais Scala se plaint que

error: type mismatch; 
found : Unit 
required: Int 

Ce que je veux est d'assigner a et b à la même valeur. Pourquoi Scala fait-il l'unité où il devrait être Int?

Répondre

2

Pourquoi demander pourquoi? Les expressions d'affectation ont le type Unit et c'est ainsi. Aucune affectation chaînée. Période.

+2

Pourquoi demander pourquoi? Parce que je trouve que ça n'a pas de sens. Java l'a, Ruby l'a, pourquoi Scala le rend différent? –

+2

Parce que Scala ne veut pas être ces langues. C'est la même raison pour laquelle Scala n'a pas de déclaration de rupture; pour vous encourager à laisser le bagage impératif que vous avez apporté de Java et Ruby à la porte. –

+1

Weeeelllll, je déteste parler, mais Scala a une déclaration de rupture de nos jours (depuis 2.8). Mais vous devez l'importer (importer scala.util.control.Breaks._) donc je suppose que personne ne l'utilisera jamais, et c'est probablement exactement ce qui était prévu :-) –

5

Votre instruction est une affectation qui renvoie Unité. Voir this related question pour des raisons pourquoi. Vous pouvez faire cela, si vous voulez:


scala> var (a,b) = (0,0) 
a: Int = 0 
b: Int = 0 

scala> a = {b = 100; b} 
a: Int = 100 
+0

Merci pour le lien. Martin expliquait qu'il voulait rendre Scala plus rapide. Je voudrais probablement faire un commentaire sur le lien original –

2

Vous pouvez définir un opérateur spécial d'affectation (il doit se terminer par deux points comme il doit être associative droite) pour vos propres types, ou écrire un emballage générique (y compris IMPLIT conversions) pour les types généraux. Je recommande de ne pas utiliser réellement, mais voilà:

case class M[T](var t:T) { 
    def =: (m: M[T]):M[T] = {m.t = t ; this} 
    } 

    implicit def anyToM[T](v:T) = M(v) 
    implicit def mToAny[T](m:M[T]) = m.t 

    def main(args: Array[String]) { 
    var a = M(0) 
    var b = M(0) 
    var c = M(0) 
    a =: b =: c =: 100 
    println(a + b + c) //--> 300 
    } 

Je pense qu'il est toujours une mauvaise idée d'appeler Magick lourde afin de sauver quelques frappes. En Allemagne, nous appelons cela « pour tirer des moineaux avec un canon » ...

1
case class assign[T](v: T) {       
    def to(vals: (T => Unit)*) { vals.foreach{ vv => vv(v) } } 
} 

var (a,b) = (0,0) 

assign(39) to (a = _, b = _) 

assert(a == 39) 
assert(b == 39) 

Ou vous pouvez le renommer pour émuler une version assez simple d'une déclaration with.

with(20) do (a = _, b = _, print) 
3
scala> var a,b,c,d,e,f,g = 0 
a: Int = 0 
b: Int = 0 
c: Int = 0 
d: Int = 0 
e: Int = 0 
f: Int = 0 
g: Int = 0 

scala> var f,i,j,k,m,n,o = new Object{} 
f: java.lang.Object = [email protected] 
i: java.lang.Object = [email protected] 
j: java.lang.Object = [email protected] 
k: java.lang.Object = [email protected] 
m: java.lang.Object = [email protected] 
n: java.lang.Object = [email protected] 
o: java.lang.Object = [email protected] 

scala> 
+0

Bon tour. Merci. –