OCaml:对象定义&克隆

时间:2013-10-11 21:37:03

标签: ocaml

class backup =
  object (self : 'mytype)
    val mutable copy = None
    method save = copy <- Some {< copy = None >}
    method restore = match copy with Some x -> x | None -> self
  end;;

在这段代码中,有几件我不太了解的事情。

  1. (self:'mytype)self表示递归类,但'mytype的作用是什么?

  2. 有些{}会获得备份副本,其中副本仍为无,并将其分配给副本吗?

  3. 谢谢!

1 个答案:

答案 0 :(得分:2)

在C ++,Java和JavaScript中,当前对象(执行该方法的对象)始终命名为this。在Smalltalk中,它被命名为self。在OCaml中,你可以给它任何你喜欢的名字。在object之后括号中出现的是什么名称是当前对象的名称。在此示例中,当前对象名为self。 (我不知道你的“递归课”是什么意思。)

在某些情况下,为当前对象的类型命名是很有用的。同样,您可以通过将: 'name放在当前对象的名称之后为其指定任何名称。在此示例中,当前对象的类型名为'mytype。该名称不会在代码中的任何位置使用,但如果代码变得更复杂,则可能会使用该名称。请注意,'mytype不仅仅是类类型backup的另一个名称。在继承自backup的类中,'mytype表示此继承类的类型。

您对save方法的描述似乎是正确的。它会创建当前对象的副本,并将副本保存在名为copy的字段中。副本的copy字段设置为None。即,即使包含的对象已经有一个副本,副本也没有自己保存的副本。此方法使用特殊符号{< ... >},它创建当前对象的副本。