OCaml数据成员没有初始化
问题描述:
我想使用OCaml创建一个数据成员的对象,但不一定要为数据成员指定一个初始值。很多示例似乎都使用了列表,但我想使用我创建的对象类型的单个实例。这可能吗?谢谢。OCaml数据成员没有初始化
class bar = object end;;
class foo =
object (self)
val myDataMember = ((* ??? *) : bar)
end;;
此外,我已经试过了选项关键字无济于事:
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;;
这里,编译器抱怨时,我希望将其指定为具有“栏中选择”类型的数据成员酒吧类型。
答
你必须使用可选类型:
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;;
答
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
我似乎有使用选项关键字时的结果的麻烦。我已更新原始帖子。请帮忙。非常感谢。 – 2009-03-06 13:28:50