2010-08-18 9 views
19

J'ai récemment commencé à jouer avec Scala (2.8) et remarqué la je peux écrire le code suivant (dans l'interpréteur Scala):Scala: Pourquoi je peux convertir Int en unité?

scala> var x : Unit = 10 
x : Unit =() 

Il est pas évident ce qui se passe là-bas. Je ne m'attendais vraiment pas à voir aucune conversion implicite à Unité.

Répondre

30

Voir la section "6.26.1" la valeur des conversions dans la version 2.8 Scala Language Specification:

...

Valeur Discarding. Si e a un certain type de valeur et le type attendu est Unité, e est converti au type attendu en l'intégrant dans le terme { e;() }.

...

+0

Notez que vous pouvez faire un avertissement pour cela en utilisant 'scalacOptions + =" -Ywarn-value-discard "' dans la configuration SBT. – VasyaNovikov

0

Eh bien, tout peut être converti en unité (ce qui est son but). Vous pouvez considérer Unité comme unité dans le treillis de (sous) types, ce qui signifie que c'est un sur-type de tout. Voir Wikipedia article.

+2

Je ne comprends pas exactement ce que vous voulez dire ici: Unit n'est pas réellement le moindre élément du type réseau dans Scala, qui est le type Any. L'unité n'a pas réellement de sous-types dans Scala pour autant que je sache, elle est définie comme "final class Unit extends AnyVal". La réponse de mkneissl ci-dessus semble donner la vraie raison pour laquelle cela fonctionne: la conversion implicite. Vouliez-vous dire quelque chose de spécifique en disant le treillis de (sous) types? – iainmcgin

+1

Cette réponse est incorrecte. – Jubobs

15

Tout peut être converti en unité. Ceci est principalement nécessaire pour prendre en charge les méthodes à effets secondaires qui renvoient néanmoins des valeurs, mais où la valeur de retour est souvent ignorée. Par exemple

import java.util.{List =>JList} 

def remove2[A](foo: JList[A], a1:A, a2:A):Unit = { 
    foo.remove(a1) 
    foo.remove(a2) //if you couldn't convert the (usually pointless) return value of remove to Unit, this wouldn't type 
}