Подтвердить что ты не робот

Инициализировать 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) 
}

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

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

4b9b3361

Ответ 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)

Это будет иметь для меня наибольший смысл.