Puoi usare -print
durante la compilazione di Scala, e stamperà una versione desertificata del codice. Sfortunatamente, vedrai che Scala ha zucchero sintattico per una buona ragione.
Vediamo un esempio molto semplice:
object T {
def first[A : Ordering](l: List[A]): A = {
val s = l.sorted
s(0)
}
}
E l'output:
package <empty> {
final object T extends java.lang.Object with ScalaObject {
def first(l: List, evidence$1: scala.math.Ordering): java.lang.Object = {
val s: List = l.sorted(evidence$1).$asInstanceOf[List]();
s.apply(0)
};
def this(): object T = {
T.super.this();
()
}
}
}
Vedrai spesso cose come <empty>
- queste sono annotazioni del compilatore, non un codice Scala valido. Ad esempio, un parametro in una classe case avrà il suo getter taggato con <stable> <caseaccessor> <accessor> <paramaccessor>
. Inoltre, una classe case avrà un numero di metodi contrassegnati con <synthetic>
, per indicare che sono stati creati dal compilatore.
Inoltre, il costruttore di this
che vedi qui non è un codice Scala valido, esattamente. In questo caso, il costruttore di scala "normale" (che è il corpo di class
, trait
o object
) viene spostato all'interno di tale metodo this
- che è il modo in cui Java stesso vede le cose.
Quindi, questo è un misto di Scala e Java, con un po 'di compilatore interno disseminato su di esso. Ma mostrerà la roba de-zuccherata.