2

我想使用 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 类型时,编译器会抱怨该数据成员具有“bar option”类型。

4

2 回答 2

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;;
于 2009-03-02T01:31:52.640 回答
1

f#get#bar#doIt;;

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

回答你的新问题。您没有将其指定为 type bar,而是将其指定为 of 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
于 2009-03-09T15:36:45.343 回答