初始化scala中的变量

初始化scala中的变量,scala,Scala,我有一个类,在这个类中,我希望通过读取一个configfile来初始化我的var,该文件生成中间对象/vals,我希望将其分组并隐藏在一个方法中。 这里是问题的最低限度-我使用参数I调用ctor,实际上是要解析的文件,init方法生成字符串s,实际上比这里更复杂,创建了许多中间对象: class Foo (val i: Int) { var s : String; def init () { s = "" + i } init () }

我有一个类,在这个类中,我希望通过读取一个configfile来初始化我的var,该文件生成中间对象/vals,我希望将其分组并隐藏在一个方法中。 这里是问题的最低限度-我使用参数I调用ctor,实际上是要解析的文件,init方法生成字符串s,实际上比这里更复杂,创建了许多中间对象:

class Foo (val i: Int) {

    var s : String;

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

    init ()
}
这将产生错误:
类Foo需要是抽象的,因为没有定义变量s
。在本例中,通过将字符串设置为“”:
var s=“”,但实际上对象比字符串更复杂,没有适当的Null实现

我知道,我可以使用一个选项,它也适用于比字符串更复杂的事情:

var s : Option [String] = None

def init () {
    s = Some ("" + i) 
}
或者我可以省去我的方法调用。使用一个选项会迫使我一遍又一遍地写一些,没有多少好处,因为没有必要使用一个“非此即彼”的选项,只需要以我认为可以的方式初始化它


有没有其他方法可以实现我的目标

var s:Whatever=.
会将s初始化为默认值(null表示引用类型,0表示数字,false表示布尔值等)

而不是创建单独的初始化方法,您应该使用以下方式执行初始化:

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

老实说,为什么要使用var?为什么不干脆做:

val rootObject = readFile(filename)

这对我来说最有意义。

我昨天没有发表评论?好吧,现在我看到了,你的答案在一个块中有一个元组看起来很明显。我喜欢它。a)因为真正的对象不是字符串,而是可变对象。和b)通过读取文件初始化的对象更多,例如数组,其维度在文件中指定,以及数组的内容。为什么它是可变的?你没抓住重点。另外,val arrayBuffer=new arrayBuffer[MyType](),然后是arrayBuffer.ToArrayi如果它是一个不可变的val,我会理解我不能在第x行声明它并在第x+n | n>0行初始化它。因此,我提到它是一个var,而不是val。因此,在Scala中,您永远不能声明
var s:String
,然后用其他方法初始化它?这对List[List[Int]=\不起作用,它会引发运行时异常。为什么?@user2441441正如我所说,引用类型的默认值为null。因此,如果您所说的运行时异常是空指针异常,则意味着您使用变量时没有首先为其分配非空值。@user2441441这不是运行时异常,这是编译错误。无论如何,您不能用
\uuu
初始化局部变量。如果希望它们为null,则必须显式地将它们初始化为
null
。如果您不希望它们为
null
,则必须将它们初始化为您希望它们为的任何其他值。@user2441441这取决于您尝试执行的操作。如果您知道变量在使用之前总是被设置为非空值(例如,如果设置它的方法总是在使用它的方法之前被调用),那么将实例变量初始化为
null
而不是使用选项是有意义的。在这种情况下,您不需要空检查,使用选项将导致不必要的代码。这种情况并不适用于局部变量。如果给定变量可能没有值,则应使用选项。@user2441441您可以像在Java中一样使用空检查,但这不是惯用法。这正是选择的意义所在。如果您知道变量在使用之前会被分配一个适当的值,但是由于某些原因您不能立即分配该值,那么使用
null
是一个有效的选择(尽管正如我所说,这种情况对于局部变量应该是非常罕见的)。在这种情况下,不需要空检查。空指针异常只有在初始假设错误时才会发生,在这种情况下,您可能想知道。