Observé una diferencia en la inferencia de tipo de Scala cuando se aplica a def
y val
.Inferencia de tipo diferente para `def` y` val` en Scala
Usando def
, puedo definir un método nulory abstracto const
devolviendo algún valor de tipo Int => Int
. Al implementar const
con un literal de la función, no necesita fuente de alimentación de un tipo de parámetro, como se puede deducir por el compilador:
trait D {
def const: Int => Int
}
object D extends D {
def const = i => i + 1
}
Esto está bien. (En el lado negativo, se está creando una nueva instancia de función para cada acceso a D.const
.)
Consideremos ahora una construcción análoga utilizando val
:
trait V {
val const: Int => Int
}
object V extends V {
val const = i => i + 1
}
Esto no se compilará, en su defecto con
error: missing parameter type
val const = i => i + 1
^
¿Por qué?
No es una buena idea usar abstract 'val''s en los rasgos (puede conducir a NPE sorprendentes). Mantenga una 'def' en el rasgo y anule con un 'val' en la implementación. O comience con un 'vago val x: X = sys.error (" anularme ")' en el rasgo. – ron
¿Podría tener algo que ver con la coincidencia de patrones? Todo entre el signo 'def' y el signo igual '=' se trata como un identificador, mientras que todo entre el 'val' y el signo igual' = 'se trata como un patrón. Simplemente una conjetura salvaje ... – agilesteel
@ron, gracias por mencionarlo, pero de una manera u otra, la pregunta permanece, ya que el uso de un 'def' en el rasgo y un' val' en la implementación lleva a la misma cuestión. – knuton