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

How can I define a val using another val in objects of Ocaml?

class my_object =
    object (self)
        val a = (* a lot of computation *)
        val b = (* use the result of a *)
    end

对于 Ocaml 中的这个片段,我知道我可以在一个方法中做到这一点,比如将 b 定义为可变的并在一个方法中计算它。但这不是一种简洁的方法,因为我需要在某处调用该方法。我能以更好的方式做到这一点吗?

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

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

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

您还可以 pre-calculate ab 的值,并在创建 class 的新实例时指定它们。这将使它们不可变。

您可以在 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 定义本身发生一次。如果你想为每个实例重做计算(例如,因为它取决于可变状态),只需将一个单位参数添加到 class:

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 有用的参数),而不是 ().