Инициализировать var в scala
У меня есть класс, где мне нравится инициализировать мой var, читая конфигурационный файл, который создает промежуточные объекты /vals, которые я хотел бы сгруппировать и скрыть в методе.
Ниже приведена минимальная проблема: я вызываю ctor с параметром i, на самом деле File для синтаксического анализа, а init-метод генерирует String s, в действительности более сложную, чем здесь, с большим количеством промежуточных объектов, создаваемых
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-реализации.
Я знаю, я могу использовать Option, который работает и для более сложных вещей, чем String:
var s : Option [String] = None
def init () {
s = Some ("" + i)
}
или я могу обойтись без моего метода. Использование опции заставит меня писать некоторые снова и снова, без особой пользы, так как нет необходимости в Ничем другом, кроме как инициализировать его так, как я думал.
Есть ли другой способ достижения моей цели?
Ответы
Ответ 1
Вместо создания отдельных методов для инициализации вы должны выполнить инициализацию, используя следующий способ:
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)
}
}
Ответ 2
var s : Whatever = _
инициализирует s значением по умолчанию для Whatever (null для ссылочных типов, 0 для чисел, false для bools и т.д.)
Ответ 3
Честно говоря, почему вы используете var? Почему бы просто не сделать:
val rootObject = readFile(filename)
Это будет иметь для меня наибольший смысл.