2009-11-12 6 views
3

Où sont exactement les méthodes * =/+ =/etc déclarées pour les sous-classes de AnyVal? Je suppose que quelque chose de spécial est fait pour ces types parce que, en val, ceux-ci ne sont pas valides, mais en tant que var, ils vont bien. Est-ce juste plus de sucre syntatique? Je suppose qu'il tourne+ =/* =/etc opérateurs sur les types AnyVal (Int, Double, etc ...) dans Scala

a *= 5 

dans

a = a * 5 

qui échoue évidemment pour un val. Cette intuition est-elle correcte? Je suppose aussi qu'il ne tente que cela pour AnyVals? Merci

Répondre

9

Votre intuition est correcte. Pour toute classe, non seulement les sous-classes de AnyVal, si une méthode d'affectation n'existe pas, alors a OP= b est transformé en a = a OP b. Rappelez-vous, OP, dans ce cas, doivent être des caractères non alphanumériques.

Ceci est décrit sur le Scala Reference (spécification Scala), section 6.12.4.

+0

Et * a * doit être mutable, à savoir un ** var **. –

+0

Donc, dans une situation connexe, alors pour une var 'a' qui a défini les deux méthodes dites', OP = 'et' OP', 'OP = b' devient' a = a OP b' ou 'a. OP = (b) '? –

+0

Et pour répondre à ma propre question, il semble que 'OP =' prenne la priorité (ce qui est logique) et 'OP' n'est appelé que si' OP = 'n'existe pas. –

0

Un petit jeu de Foo:

class Foo (val v: String, val n: String) { 
    override def toString : String = v + " : " + n 
    def #: (i: Int) : Foo = { 
    new Foo (v.substring (i), n.substring (i)) }} 

var foo = new Foo ("Martin", "Odersky") 

scala> foo #:= 2 
scala> foo 
res30: Foo = rtin : ersky 

scala> foo #:= 2 
scala> foo  
res32: Foo = in : sky 

scala> foo #:= 2 
scala> foo  
res34: Foo = : y 
Questions connexes