oop - 无需初始化的 OCaml 数据成员

标签 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 类型时,编译器提示该数据成员具有“bar option”类型。

最佳答案

您必须使用可选类型:

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

关于oop - 无需初始化的 OCaml 数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/600637/

相关文章:

c++ - 二维数组数据成员的初始化

c++ - std::function 可以存储指向数据成员的指针吗?

php - 在php中创建匿名对象

java - 从子类对象使用父类(super class)的 getClass 方法

makefile - 构建 OCaml 交叉编译器 - 配置部分

serialization - 磁盘上是否有 ocaml 库存储/使用数据结构

functional-programming - 为什么 1::2::[] 和 [1;2] 在 OCaml 中的 == 不一样?

c++ - in_addr 结构需要解释

javascript - 使用 Javascript 创建父类(super class)(继承)

java - 实现接口(interface)的抽象类有什么用