Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Object 如何使用Ocaml对象中的另一个val定义val?_Object_Ocaml - Fatal编程技术网

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

Object 如何使用Ocaml对象中的另一个val定义val?,object,ocaml,Object,Ocaml,对于Ocaml中的这个片段,我知道我可以在一个方法中做到这一点,比如将b定义为可变的并在一个方法中计算它。但这不是一种简洁的方法,因为我需要在某个地方调用该方法。我可以用更好的方法来实现这一点吗?一种可能性是在初始值设定项中设置b的值: class my_object = object (self) val a = (* a lot of computation *) val b = (* use the result of a *) end c

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

一种可能性是在初始值设定项中设置b的值:

class my_object =
    object (self)
        val a = (* a lot of computation *)
        val b = (* use the result of a *)
    end
class my\u对象=
对象(自身)
val a=14
val可变b=0

初始值设定项b可以在
声明和
对象
定义之间定义局部变量,如中所示

class my\u对象=
让我的a=(*大量计算*)进来
让我的_b=(*使用我的_a*)在
对象(自身)
val a=我的a
val b=我的
完;;;
请注意,对于这样的定义,
my_a
my_b
的计算将在类定义本身发生一次。如果要对每个实例重新进行计算(例如,因为它取决于可变状态),只需向类中添加一个单位参数:

class my_对象()=
让我的a=(*大量计算*)进来
让我的_b=(*使用我的_a*)在
对象(自身)
val a=我的a
val b=我的
完;;;

在这种情况下,一个实例将由
newmyu对象()
创建。当然,您可以有任意数量和类型的参数(包括对计算
a
b
有用的参数),而不是
()

您真的需要类吗?或者你能用普通函数创建对象吗?根据我的经验,很少有课程是有益的。我本人从未在任何严肃的开发中使用过它们。当然,即使对于类,您也可以编写一个构建器函数来预计算值,但对于预期使用
new
创建的类来说,这要尴尬得多。
class my_object =
    object(self)
        val a = 14
        val mutable b = 0
        initializer b <- a + 10
    end