我想使用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选项”类型。
答案 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