问题描述
class my_object =
object (self)
val a = (* a lot of computation *)
val b = (* use the result of a *)
end
对于Ocaml中的此代码段,我知道我可以用一种方法来做到这一点,例如将b定义为可变的并在方法中对其进行计算。但这不是一种简洁的方法,因为我需要在某个地方调用该方法。我能以更好的方式做到这一点吗?
解决方法
您可以在class
声明和object
定义之间定义局部变量,如
class my_object =
let my_a = (* a lot of computation *) in
let my_b = (* uses my_a *) in
object(self)
val a = my_a
val b = my_b
end;;
请注意,使用这样的定义,my_a
和my_b
的评估将在类定义本身处进行一次。如果您想为每个实例重做计算(例如,因为它取决于可变状态),只需在该类中添加一个单位参数:
class my_object () =
let my_a = (* a lot of computation *) in
let my_b = (* uses my_a *) in
object(self)
val a = my_a
val b = my_b
end;;
在这种情况下,实例将由new my_object ()
创建。当然,您可以使用任何数量和类型的参数(包括对计算a
或b
有用的参数)来代替()
。
一种可能是在初始化程序中设置b的值:
class my_object =
object(self)
val a = 14
val mutable b = 0
initializer b <- a + 10
end
这避免了必须记住从类外部的某个地方调用方法。
您还可以预先计算a
和b
的值,并在创建类的新实例时指定它们。这将使它们不可变。