OCaml数据成员没有初始化

问题描述:

我想使用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;; 

这里,编译器抱怨时,我希望将其指定为具有“栏中选择”类型的数据成员酒吧类型。

你必须使用可选类型:

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

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