如何在 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 a
和 b
的值,并在创建 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_a
和 my_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 ()
创建。当然,您可以使用任意数量和类型的参数(包括对计算 a
或 b
有用的参数),而不是 ()
.
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 a
和 b
的值,并在创建 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_a
和 my_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 ()
创建。当然,您可以使用任意数量和类型的参数(包括对计算 a
或 b
有用的参数),而不是 ()
.