2013-10-11 57 views
0
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;; 

在這段代碼中,有幾件事情我不太明白。OCaml:對象定義和克隆

  1. (self:'mytype)self意味着遞歸類,但'mytype?'的作用是什麼?

  2. 有些{}獲取備份副本,其中副本仍爲無,並將其分配給副本?

謝謝!

回答

2

在C++,Java和JavaScript中,當前對象(執行該方法的對象)總是被命名爲this。在Smalltalk中,它被命名爲self。在OCaml中,你可以給它任何你喜歡的名字。無論名稱出現在object之後的括號中,都是當前對象的名稱。在本例中,當前對象名爲self。 (我不知道「遞歸類」是什麼意思。)

在某些情況下,爲當前對象的類型命名是很有用的。再次,您可以通過在當前對象的名稱後加上: 'name來給它起任何名字。在本例中,當前對象的類型被命名爲'mytype。這個名字不會在代碼中的任何地方使用,但是如果代碼變得更復雜,它可能會被使用。請注意,'mytype不僅是班級類型backup的另一個名稱。在繼承自backup的類中,'mytype表示此繼承類的類型。

您對save方法的描述看起來不錯。它會創建當前對象的副本並將副本保存在名爲copy的字段中。副本的copy字段設置爲None。也就是說,即使包含對象已經有一個,副本也沒有自己的保存副本。此方法使用特殊標記{<...>},它創建當前對象的副本。