with trait mixin higher functions example data scala

trait - Inicializar una var en scala



scala trait (3)

En lugar de crear métodos de inicialización separados, debe realizar la inicialización de la siguiente manera:

class Foo(val i: Int) { var s: String = { var s0 = " " s0 += i // do some more stuff with s0 s0 } var dashedDate = { val dashed = new SimpleDateFormat("yy-MM-dd") dashed.format(updated) } // Initializing more than one field: var (x, y, z) = { var x0, y0, z0 = 0 // some calculations (x0, y0, z0) } }

Tengo una clase en la que me gusta inicializar mi var leyendo un archivo de configuración, que produce objetos / valores intermedios, que me gustaría agrupar y ocultar en un método. Aquí está el mínimo del problema: llamo al ctor con un parámetro, en realidad un archivo a analizar, y el método init genera las cadenas, en realidad más complicadas que aquí, con muchos objetos intermedios que se están creando. :

class Foo (val i: Int) { var s : String; def init () { s = "" + i } init () }

Esto producirá el error: la class Foo needs to be abstract, since variable s is not defined . En este ejemplo, es fácil de resolver configurando la Cadena en "": var s = ""; , pero en realidad el objeto es más complejo que String, sin una implementación nula adecuada.

Lo sé, puedo usar una opción, que funciona para cosas más complicadas que String también:

var s : Option [String] = None def init () { s = Some ("" + i) }

O puedo prescindir de mi llamada al método. Usar una opción me obligará a escribir Algunos una y otra vez, sin mucho beneficio, ya que no hay necesidad de un Ninguno más que inicializarlo de esa manera que pensé que podría.

¿Hay otra manera de lograr mi objetivo?


Honestamente, ¿por qué estás usando var? ¿Por qué no simplemente hacer:

val rootObject = readFile(filename)

Esto tendría más sentido para mí.


var s : Whatever = _ inicializará s al valor predeterminado para Whatever (null para tipos de referencia, 0 para números, false para bools, etc.)