初始化scala中的var

use*_*own 16 scala

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

class Foo (val i: Int) {

    var s : String;

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

    init ()
}
Run Code Online (Sandbox Code Playgroud)

这将产生错误: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) 
}
Run Code Online (Sandbox Code Playgroud)

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

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

sep*_*p2k 17

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

  • 谢谢!它是scala的最佳实践吗? (3认同)

mis*_*tor 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)
  }
}
Run Code Online (Sandbox Code Playgroud)