Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 没有初始化的OCaml数据成员_Oop_Ocaml_Data Members - Fatal编程技术网

Oop 没有初始化的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

我希望使用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;;
当然,要使其可用,您可能必须使用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
时想要表达什么意思,但它是class
foo
(函数对象)的参数,与class
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
类栏=对象(自身)
方法doIt=Printf.Printf“执行它”
结束
类foo(arg1:bar)=对象(自身)
val可变数据=arg1
方法get=data

方法set new_data=data使用option关键字时,我似乎对结果有问题。我已经更新了原来的帖子。请帮忙。谢谢你。