2013-05-29 17 views
5

Dalla documentazione ScalaTest:Cos'è questo Scala 'nuova' sintassi

class ExampleSpec extends FlatSpec { 

def fixture = 
new { 
    val builder = new StringBuilder("ScalaTest is ") 
    val buffer = new ListBuffer[String] 
} 

...

io non capisco come la nuova parola chiave è in uso qui. l'apparecchiatura è ovviamente una funzione, che dichiara e restituisce ... cosa? Sembra essere un oggetto, poiché ha membri (builder & buffer) a cui è possibile accedere. notazione.

È ciò che viene creato qui una classe anonima che è una sottoclasse di AnyRef?

+1

Se volete saperne di più su questo, cercare "la raffinatezza strutturale" o "sottotipaggio strutturale" – stew

+0

Vorrei avrei detto "GRADO una classe anonima" invece di "classe anonima" - l'interscambio di "oggetto" e "classe" è uno dei miei pet-peeves di lunga data. :) –

risposta

13

Sì, restituisce l'istanza di una classe qualsiasi. Non è difficile da controllare da soli in seduta REPL:

scala> def fixture = new { val string = "mr. String" } 
fixture: Object{val string: String} 

Java può fare la stessa cosa in sostanza, che ci crediate o no. Quanto segue è valido Java

(new Object() { 
    public void sayHello() { 
    System.out.println("hello!"); 
    } 
}).sayHello(); 

la versione Java è solo una sintassi leggermente più dettagliato e presenta una limitazione del sistema tipo che rende più inutile. più qui http://james-iry.blogspot.com/2009/04/java-has-type-inference-and-refinement.html

+0

@JamesIry, ma purtroppo in java è più difficile utilizzare tali istanze anonime non al posto della creazione (supponendo che non stiamo usando alcuna interfaccia e classe). –

+1

Vale la pena ricordare che tutti i metodi richiamati su un oggetto definito come tale sono chiamati da reflection. –

+0

Buon punto Jean - ma dovrebbe essere spiegato perché è importante, ad esempio la riflessione è costosa. – selig