2011-11-20 13 views
7

Dado el método genérico register a continuación, me gustaría definir el operador := como un alias simbólico.¿Cuál es la notación más corta para definir un operador como un alias de método en Scala?

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

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

Originalmente quería escribir algo como esto:

val := = register _ 

Pero eso me da la firma de la función Nothing => Nothing. Mi próximo intento fue parametrizarlo con el tipo Prop pero aparentemente solo funciona si lo hago un def, que puede tomar los parámetros de tipo y pasarlos hacia adelante.

Idealmente me gustaría omitir la anotación @inline, pero no estoy seguro de qué código objeto hace el compilador Scala.

más importante mi objetivo es que no tiene el método del := duplicar todas las partes de la firma del método register excepto por el nombre y luego simplemente dejar que el ex delegado a este último.

Respuesta

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

debería funcionar.

+0

La delegación de métodos con firmas duplicadas es exactamente lo que quería evitar. Ver mi último párrafo "Lo más importante ...". Además, no quiero tener que reenviar manualmente ningún argumento. –

+0

@TimFriske Desafortunadamente, tendrás que hacerlo, si quieres hacer esto. –

1

No creo que haya forma de lograr lo que busca (básicamente lo que alias le da en Ruby) en Scala tal como está actualmente. El autoproxy plugin es un intento de solucionar este tipo de problema, pero aún no está listo para el uso de producción debido a varios problemas con la generación de código en los complementos del compilador.

1

Usted puede hacer esto:

def := : Prop => Prop = register 

Así que, básicamente Aquí se define en función del tipo (Prop => Prop) que simplemente hace referencia a otra función.

Cuestiones relacionadas