2010-05-02 22 views
16

Tengo una clase donde me gusta inicializar mi var leyendo un archivo de configuración, que produce objetos intermedios/vals, que me gustaría agrupar y ocultar en un método. Aquí está el mínimo problema: llamé al ctor con un param i, en realidad un archivo para analizar, y el método init genera el String s, en realidad más complicado que aquí, con muchos objetos intermedios creado:inicializar una var en scala

class Foo (val i: Int) { 

    var s : String; 

    def init() { 
     s = "" + i 
    } 

    init() 
} 

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

Lo sé, lo puede usar una opción, que funciona para cosas más complicadas de cadena demasiado:

var s : Option [String] = None 

def init() { 
    s = Some ("" + i) 
} 

o puedo prescindir de mi methodCall. Usar una Opción me obligará a escribir Algunas veces una y otra vez, sin mucho beneficio, ya que no hay necesidad de nada más que inicializarlo de esa manera, pensé que podría.

¿Hay alguna otra manera de lograr mi objetivo?

+0

Entonces, en Scala, nunca se puede declarar un 'var s: String' y luego inicializarlo en algún otro método? – asgs

Respuesta

17

En lugar de crear métodos distintos para la inicialización, se debe realizar la inicialización utilizando 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) 
    } 
} 
+0

¿Por qué el voto a favor? – missingfaktor

+0

¿No comenté mi comentario ayer? Bueno, ahora que lo veo, tu respuesta con una tupla en un bloque parece tan obvia. Me gusta. –

15

var s : Whatever = _ inicializará s con el valor por defecto para Cualquiera que sea (nulo para los tipos de referencia, 0 para los números, falsa para Bools etc.)

+0

Voy a probar esto también. :) –

+0

Lo probé y funciona también. :) –

+3

gracias! ¿Es la mejor práctica en Scala? – voho

0

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

val rootObject = readFile(filename) 

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

+0

a) porque el objeto real no es una cadena, sino un objeto mutable. y b) hay más objetos inicializados al leer el archivo, por ejemplo, una matriz, para la cual se especifican las dimensiones en el archivo, así como también el contenido de la matriz. –

+0

¿Por qué es mutable? te estás perdiendo el punto. También, val ArrayBuffer = new ArrayBuffer [MyType]() y luego arrayBuffer.toArray – egervari

+0

Si fue un val unmutable, me entender que no se puede declarar que en la línea x y initialice en línea x + n | n> 0. Por lo tanto, mencioné que es una var, no un val. –

Cuestiones relacionadas