parte - scala software
¿Por qué el lenguaje Scala requiere que inicialice una variable de instancia en lugar de confiar en un valor predeterminado? (3)
El lenguaje Scala requiere que inicialice su variable de instancia antes de usarla. Sin embargo, Scala no proporciona un valor predeterminado para su variable. En su lugar, debe configurar su valor manualmente utilizando el carácter de subrayado de comodín, que actúa como un valor predeterminado, de la siguiente manera:
var name:String = _
Lo sé, lo sé ... Puedo definir un constructor en la definición de clase, que toma como parámetro nuestra variable de instancia, por lo que Scala no fuerza su inicialización como se muestra a continuación
class Person(var name:String)
Sin embargo, necesito declararlo en el cuerpo porque necesito usar una anotación de Java cuyo ElementType es FIELD o METHOD; es decir, solo se puede aplicar a una variable de instancia o método declarado en el cuerpo de nuestra clase.
Pregunta: ¿Por qué el lenguaje Scala requiere que inicialice una variable de instancia, ya sea un valor predeterminado _ o lo que quiera, declarado en el cuerpo de una clase en lugar de confiar en un valor predeterminado?
Puede aplicar la anotación cuando la especifique como un argumento de constructor. Además, es posible que tenga que usar una meta-anotación para restringir el destino al que se aplica la anotación que está utilizando: consulte http://www.scala-lang.org/api/2.10.2-RC2/index.html#scala.annotation.meta.package
Sin embargo, su pregunta acerca de "confiar en un valor predeterminado" no está clara. La inicialización utilizando un guión bajo corresponde a asignar el valor de la variable a nulo. ¿En qué otro defecto estás pensando?
Scala no tiene ningún problema con "var name: String" en el cuerpo de la clase. ¿Lo intentaste? Aunque no significa lo que quieres que signifique. Es una var abstracta.
abstract class A {
var name: String
}
// some possible uses for abstract vars
trait B { type T ; var name: T }
class B1 extends B { type T = Int ; var name: Int = 5 }
// hey, no storage
class B2 extends B { type T = String ; def name = "abc" ; def name_=(x: String) = () }
Si usa un código como el siguiente, está declarando que el name
debe ser abstracto:
class A {
var name: String
}
Supongo que ya lo sabías. Entonces tu pregunta es más bien de naturaleza sintáctica. La respuesta es la consistencia con otros posibles candidatos abstractos .
Supongamos que quieres hacer algo como esto:
class A {
var variable: String = _ // variable has some default value (probably null)
val value: String = _ // value cannot have any default values, since it cannot be reassigned later.
def method: String = _ // method could return some default value (probably null)
type theType = _ // what should the default type be? (Any perhaps?)
}
Los últimos tres ejemplos ni siquiera se compilan. Ahora supongamos que quieres hacer algo como esto:
class A {
var variable: String
val value: String
def method: String
type theType
}
Desde mi punto de vista, incluso alguien que apenas entiende a Scala solo ve declaraciones. No hay manera de malinterpretarlos, porque no hay nada más que declaraciones. La única confusión surge cuando viene de otro idioma y supone por un segundo que hay algunos valores predeterminados. Pero esta confusión desaparece tan pronto como ve el primer ejemplo (el que tiene los valores predeterminados). Y, por cierto, su clase tiene que ser parte de una jerarquía abstracta para que se le permita declarar miembros abstractos, por lo que incluso si es nuevo en el idioma, ya recibe ayuda adicional del compilador.
Espero que esto responda a tu pregunta y feliz codificación.