new { def ...}
costrutto crea un nuovo oggetto anonimo con structural typeAnyRef{def ...}
:
scala> val aa = new { def kk = "bb" }
aa: AnyRef{def kk: String}
Il tuo metodo UNTIL
è accessibile a causa della caratteristica chiamata "l'accesso riflettente di membro di tipo strutturale", e si dovrebbe anche avere un import scala.language.reflectiveCalls
, almeno a Scala 2.11.2 a seguito di SIP 18: Modularizing Language Features:
scala> aa.kk
<console>:9: warning: reflective access of structural type member method kk should be enabled
by making the implicit value scala.language.reflectiveCalls visible.
This can be achieved by adding the import clause 'import scala.language.reflectiveCalls'
or by setting the compiler option -language:reflectiveCalls.
See the Scala docs for value scala.language.reflectiveCalls for a discussion
why the feature should be explicitly enabled.
aa.kk
^
res0: String = bb
Nota, che è un po 'più lento che definire class Repeatable {def UNTIL = ...}
, perché (per JVM) la funzione REPEAT
restituisce Object
(AnyRef) e non è presente alcun tipo da trasmettere, quindi Scala invoca UNTIL
utilizzando la reflection. Inoltre, non ha introdotto alcuna classe sintetica perché il tipo strutturale può corrispondere a qualsiasi classe esistente (qualsiasi altra classe con il metodo UNTIL
appropriato).
Perché 'UNTIL' è un metodo, non un nome di una funzione (nger). –
Quindi, 'new {}' crea un oggetto? come so, il metodo dovrebbe essere in un oggetto – 1ambda