инициализировать переменную в Scala - PullRequest
16 голосов
/ 02 мая 2010

У меня есть класс, где мне нравится инициализировать мою переменную, читая файл конфигурации, который создает промежуточные объекты / значения, которые я хотел бы сгруппировать и спрятать в методе. Вот самый минимум проблемы - я вызываю ctor с параметром i, в действительности это файл для анализа, а метод 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.

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

var s : Option [String] = None

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

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

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

Ответы [ 3 ]

17 голосов
/ 02 мая 2010

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

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)
  }
}
17 голосов
/ 02 мая 2010

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

0 голосов
/ 03 мая 2010

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

val rootObject = readFile(filename)

Это было бы наиболее логично для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...