2010-05-02 3 views
16

У меня есть класс, где мне нравится инициализировать мой var, читая configfile, который создает промежуточные объекты/vals, которые я хотел бы сгруппировать и скрыть в методе. Ниже приведена минимальная проблема - я вызываю ctor с параметром i, на самом деле File для синтаксического анализа, а init-метод генерирует String s, в действительности более сложный, чем здесь, с большим количеством промежуточных объектов, являющихся создано:initialize a var in scala

class Foo (val i: Int) { 

    var s : String; 

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

    init() 
} 

Это приведет к ошибке: class Foo needs to be abstract, since variable s is not defined. В этом примере легко решить, установив String на "": var s = "";, но на самом деле объект более сложный, чем String, без соответствующей Null-реализации.

Я знаю, что я могу использовать один вариант, который работает для более сложных вещей, чем струны тоже:

var s : Option [String] = None 

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

или я могу обойтись без моей methodcall. Использование опции заставит меня писать некоторые снова и снова, без особой пользы, так как нет необходимости в Ничем другом, кроме как инициализировать его так, как я думал.

Есть ли другой способ достичь моей цели?

+0

Итак, в Scala вы никогда не сможете объявить «var s: String», а затем инициализировать его каким-либо другим способом? – asgs

ответ

17

Вместо того чтобы создавать отдельные методы для инициализации, вы должны выполнить инициализацию, используя следующую путь:

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

Почему downvote? – missingfaktor

+0

Вчера не комментировал мой комментарий? Ну, теперь, когда я это вижу, ваш ответ с кортежем в блоке выглядит настолько очевидным. Мне это нравится. –

15

var s : Whatever = _ будет инициализировать с до значения по умолчанию для Whatever (нулевого значения для ссылочных типов, 0 для чисел, ложно для BOOLS и т.д.)

+0

Я тоже проверю это. :) –

+0

Я тестировал его, и он тоже работает. :) –

+3

спасибо! это лучшая практика в scala? – voho

0

Честно говоря, почему вы используете var? Почему бы просто не сделать:

val rootObject = readFile(filename) 

Это имело бы для меня смысл.

+0

a) потому что реальный объект не является String, а изменчивым объектом. и б) есть больше объектов, инициализированных путем чтения файла, например массива, для которого указаны размеры в файле, а также содержимого массива. –

+0

Почему это изменчиво? вам не хватает смысла. Кроме того, вал ArrayBuffer = новый ArrayBuffer [MyType]() , а затем arrayBuffer.toArray – egervari

+0

Если он был unmutable вал, я понимаю, что не может объявить его в строке х и initialice его в соответствие х + п | п> 0. Поэтому я упомянул, что это var, а не val. –