2013-05-10 286 views
4

我在我的一个scala类中有一个变量,它的值仅在调用特定方法时第一次设置。方法参数值将是该字段的初始值。所以我有这个:scala - 未初始化的变量声明

classX { 
    private var value: Int= _ 
    private var initialised = false 

    def f(param: Int) { 
    if (!initialised){ 
     value = param 
     initialised = true 
    } 
    } 
} 

是否有更像scala的方式来做到这一点?选择似乎有点太麻烦了......

+0

f()方法的用途是什么?它被称为多次,但在第一次之后被忽略?如果在第一次调用f()之前访问'value'会发生什么? – 2013-05-10 18:44:43

+5

你在做什么基本上是自我管理Option的弱实现。你不喜欢他们什么? – ceyko 2013-05-10 18:45:16

+4

请注意,你的班级根本不是线程安全的! – 2013-05-10 18:48:16

回答

13

实际使用Option少一点麻烦,因为与否value已初始化的问题可以从OptionSomeNone的值来推断。这比使用标志更符合惯用的Scala。

class X() { 
    var value: Option[Int] = None 

    def f(param: Int) { 
    value match{ 
     case None => value = Some(param) 
     case Some(s) => println("Value already initialized with: " + s) 
    } 
    } 
} 

scala> val x = new X 
x: X = [email protected] 

scala> x.f(0) 

scala> x.value 
res1: Option[Int] = Some(0) 

scala> x.f(0) 
Value already initialized with: 0 
+4

+1学习'Option'。这是惯用的,会让你摆脱困境。另外,我知道你说'value'是稍后设置的,但是强烈考虑在类的构造函数中设置'value',这是使类不可变的一大步。 – Bluu 2013-05-10 19:38:18

+0

我们可以用val来做这样的事吗? – Sohaib 2015-06-23 05:50:54