Oop 没有初始化的OCaml数据成员
我希望使用OCaml创建具有数据成员的对象,但不一定要为数据成员指定初始值。许多示例似乎使用列表,但我想使用我创建的对象类型的单个实例。这可能吗?谢谢Oop 没有初始化的OCaml数据成员,oop,ocaml,data-members,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.p
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;;
当然,要使其可用,您可能必须使用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;;
class-foo=
对象(自身)
val可变myDataMember=(无:条形选项)
方法集t=myDataMember x
无->带“未初始化”的故障
完;;;
去酒吧
在这里,编译器抱怨
具有“条形选项”类型的数据成员
当我想具体说明
酒吧类型
回答你的新问题。您没有将其指定为条形
,而是将其指定为条形选项
(正是在您键入(无:条形选项)
)时)。要访问它,您需要匹配-get
方法中的匹配可能更好,但这一点是有效的
match f#get#bar with
| Some x -> x#doIt
| None -> failwith "value not initialized"
我不知道您在编写class foo bar
时想要表达什么意思,但它是classfoo
(函数对象)的参数,与classbar
无关。看看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
类栏=对象(自身)
方法doIt=Printf.Printf“执行它”
结束
类foo(arg1:bar)=对象(自身)
val可变数据=arg1
方法get=data
方法set new_data=data使用option关键字时,我似乎对结果有问题。我已经更新了原来的帖子。请帮忙。谢谢你。