如何在Ocaml的对象中使用另一个val定义一个val?

问题描述

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_amy_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 ()创建。当然,您可以使用任何数量和类型的参数(包括对计算ab有用的参数)来代替()

,

一种可能是在初始化程序中设置b的值:

class my_object =
    object(self)
        val a = 14
        val mutable b = 0
        initializer b <- a + 10
    end

这避免了必须记住从类外部的某个地方调用方法。

您还可以预先计算ab的值,并在创建类的新实例时指定它们。这将使它们不可变。