OCaml数据成员没有初始化

时间:2009-03-01 22:08:42

标签: oop ocaml data-members

我想使用OCaml创建一个带有数据成员的对象,但不一定要为数据成员指定初始值。许多示例似乎使用列表,但我想使用我创建的对象类型的单个实例。这可能吗?感谢。

class bar = object end;;

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

此外,我尝试使用option关键字无效:

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;;

这里,当我希望将数据成员指定为条形类型时,编译器会抱怨数据成员具有“bar选项”类型。

2 个答案:

答案 0 :(得分:3)

您必须使用可选类型:

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

当然,为了使用它你可能不得不使用mutable:

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;;

答案 1 :(得分: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