我正在尝试创建一个具有参数"值"和"维度"的类鼠。老鼠有一个成员"健身"。我希望这个成员由构造函数初始化,但声明这个成员会强制它被显式实例化。
这是一只具有会员健身的类鼠。我已经声明但未定义成员,因为我想通过构造函数获取它。
class rat(value:Int,dimensions:Int){
var fitness:Int
def rat(){
fitness=sol_fit()
}
def sol_fit():Int={
var f=value*dimensions
f
}
}
对于一个类来说,这看起来是一个非常糟糕的设计。我几乎质疑它的一切。但是编译它很容易:只需给var
一个默认值。
var fitness:Int = _
现在它可以编译,但fitness
的值将保持默认值(在本例中0
),因为您已经定义了计算正确适应度值的方法,但从未调用过它,因此fitness
值保持不变。
但实际上,为什么要经历所有的繁琐工作?为什么不直接用计算值初始化它呢?为什么不var fitness:Int = sol_fit()
或干脆var fitness:Int = value*dimensions
?
构造函数是类声明后面的块,所以可以这样写:
class rat(value: Int, dimensions: Int) {
val fitness: Int = value*dimensions
}
表达式value*dimensions
将在创建类的实例时计算,并作为Int
值放置在类内存中。当访问fitness
成员时,将从类内存中检索并返回该值;它不会被重新计算。
如果fitness
是用def
而不是val
声明的,那么每次访问fitness
时都会计算表达式。
如果使用var
声明fitness
,则可以将该值替换为新值,并且任何后续对fitness
的访问都将返回新值。