初始化scala中的var

时间:2010-05-02 17:34:33

标签: scala

我有一个类,我喜欢通过读取一个configfile来初始化我的var,它生成中间对象/ val,我想将它们分组并隐藏在方法中。 这是问题的最小部分 - 我用一个参数调用ctor,实际上是一个要解析的文件,而init-method生成String,实际上比这里更复杂,创建了很多中间对象:

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) 
}

或者我可以省去我的方法电话。使用一个选项将迫使我一遍又一遍地写一些,没有太大的好处,因为没有必要除了以我认为可能的方式初始化它。

还有另一种方法来实现我的目标吗?

3 个答案:

答案 0 :(得分:17)

var s : Whatever = _会将s初始化为Whatever的默认值(引用类型为null,数字为0,bools为false等)

答案 1 :(得分: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)
  }
}

答案 2 :(得分:0)

老实说,你为什么要使用var?为什么不这样做:

val rootObject = readFile(filename)

这对我来说最有意义。