2011-11-20 7 views
7

Dato il metodo generico register di seguito vorrei definire l'operatore := come alias simbolico.Qual è la notazione più breve per definire un operatore come alias di un metodo in Scala?

def register[Prop <: Property[_]](prop: Prop): Prop 

@inline 
final def :=[Prop <: Property[_]] = register[Prop] _ 

Originariamente ho voluto scrivere qualcosa del genere:

val := = register _ 

Ma che mi dà la funzione di firma Nothing => Nothing. Il mio prossimo tentativo è stato quello di parametrizzarlo con il tipo Prop ma che apparentemente funziona solo se lo faccio a def, che può prendere i parametri di tipo e passarli in poi.

Idealmente, vorrei omettere l'annotazione @inline ma non sono sicuro di quale codice oggetto il compilatore Scala ne faccia.

Più importante il mio obiettivo è non avere il metodo := duplicare tutte le parti la firma del metodo del register tranne che per il nome e poi semplicemente lasciare che la ex delegato a questi ultimi.

risposta

2
def :=[Prop <: Property[_]](prop: Prop) = register(prop) 

dovrebbe funzionare.

+0

La delega dei metodi con firme duplicate è esattamente ciò che volevo evitare. Vedi il mio ultimo paragrafo "Più importante ...". Inoltre non voglio dover manualmente avanzare alcun argomento. –

+0

@TimFriske Sfortunatamente, dovrai farlo, se vuoi farlo. –

1

Non credo che ci sia un modo per ottenere ciò che stai cercando (in pratica ciò che alias ti dà in Ruby) in Scala come al momento attuale. Il autoproxy plugin è un tentativo di risolvere questo tipo di problema, ma non è ancora pronto per l'uso di produzione a causa di vari problemi con la generazione del codice nei plugin del compilatore.

1

Si può fare questo:

def := : Prop => Prop = register 

Quindi, in pratica qui si definisce una funzione di tipo (Prop => Prop) che fa riferimento solo un'altra funzione.

Problemi correlati