2010-05-02 78 views
16

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

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实现。

我知道,我可以使用的选项,这不是字符串也适用于更复杂的东西:

var s : Option [String] = None 

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

或者我可以用我的methodcall免除。使用选项会迫使我一遍又一遍地写一些东西,没有多少好处,因为不需要别人来以我想的方式初始化它。

是否有另一种方法来实现我的目标?

+0

那么,在Scala中,你永远不能声明'var s:String',然后用其他方法初始化它? – asgs 2016-04-23 14:25:04

回答

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

为什么downvote? – missingfaktor 2010-05-03 01:26:43

+0

昨天我没有提交我的评论?那么,现在我看到它,你在一个块中用一个元组的答案看起来很明显。我喜欢。 – 2010-05-03 09:11:12

15

var s : Whatever = _将初始化s到默认值,无论(空引用类型,0数字,假的布尔变量等)

+0

我也会测试。 :) – 2010-05-02 21:15:52

+0

我测试了它,它也起作用。 :) – 2010-05-12 03:24:14

+3

谢谢!这是scala中的最佳做法吗? – voho 2015-01-15 14:02:12

0

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

val rootObject = readFile(filename) 

这将对我最有意义。

+0

a)因为真实对象不是一个String,而是可变对象。和b)通过读取文件来初始化更多的对象,例如文件中指定尺寸的数组以及数组的内容。 – 2010-05-03 17:25:10

+0

为什么它是可变的?你错过了这一点。 此外,VAL arrayBuffer =新ArrayBuffer [的MyType]() 然后arrayBuffer.toArray – egervari 2010-05-03 19:55:44

+0

如果它是一个unmutable VAL,我会明白,我不能行x声明它和行x + N initialice它| N> 0。所以我提到它是一个var而不是val。 – 2010-05-04 00:56:03