2009-03-01 154 views
2

我想使用OCaml創建一個數據成員的對象,但不一定要爲數據成員指定一個初始值。很多示例似乎都使用了列表,但我想使用我創建的對象類型的單個實例。這可能嗎?謝謝。OCaml數據成員沒有初始化

class bar = object end;; 

class foo = 
object (self) 
val myDataMember = ((* ??? *) : bar) 
end;; 

此外,我已經試過了選項關鍵字無濟於事:

class bar = 
object (self) 
    method doIt = Printf.printf "Doing it!" 
end;; 

class foo bar = 
object (self) 
    val mutable myDataMember = (None : bar option) 
    method get = myDataMember 
end;; 

let f = new foo (new bar);; 
f#get#bar#doIt;; 

這裏,編譯器抱怨時,我希望將其指定爲具有「欄中選擇」類型的數據成員酒吧類型。

回答

3

你必須使用可選類型:

class foo = 
object (self) 
val myDataMember = (None : bar option) 
end;; 
當然

,這是可用的,你可能將不得不使用可變:

class foo = 
object (self) 
    val mutable myDataMember = (None : bar option) 
    method set t = myDataMember <- (Some t) 
    method get() = 
    match myDataMember with 
    Some x -> x 
    None -> failwith "not initialized" 
end;; 
+0

我似乎有使用選項關鍵字時的結果的麻煩。我已更新原始帖子。請幫忙。非常感謝。 – 2009-03-06 13:28:50

1

F#獲得#酒吧#doIt方法;;

這裏,編譯器抱怨時,我想指定它有 欄類型的具有「欄中選擇」類型 的 數據成員。

回覆您的新問題。您沒有指定它的類型爲bar,您將其指定爲bar option(恰好當您輸入(None : bar option)時)。要訪問這個,你需要匹配 - 這在get方法中可能會更好,但這一點是有效的。

match f#get#bar with 
    | Some x -> x#doIt 
    | None -> failwith "value not initialized" 

我不知道你的意圖bar意味着,當你寫的,class foo bar,但它是爲類foo(功能對象)的參數並沒有任何與類bar。看看foo的類型定義。

'a -> object val mutable data : bar option method get : bar option end 

這是一個對象,它接受任何類型的一個參數並構造該對象的一個​​實例。總體而言,我不認爲你需要一個選項類型作爲解決方案,但利用功能對象,如下所示:

class bar = object (self) 
    method doIt = Printf.printf "Doing it" 
end 

class foo (arg1:bar) = object (self) 
    val mutable data = arg1 
    method get = data 
    method set new_data = data <- new_data 
end