【问题标题】:OCaml data members without initialization没有初始化的 OCaml 数据成员
【发布时间】:2009-03-01 22:08:41
【问题描述】:

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

【问题讨论】:

    标签: oop ocaml data-members


    【解决方案1】:

    你必须使用可选类型:

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

    【讨论】:

    • 我在使用 option 关键字时似乎对结果有问题。我已经更新了原帖。请帮忙。到目前为止,谢谢。
    【解决方案2】:

    f#get#bar#doIt;;

    在这里,编译器抱怨 具有“栏选项”类型的数据成员 当我想指定它有 条形。

    针对您的新问题。您没有将其指定为bar 类型,而是将其指定为bar option(正是在您键入(None : bar option) 时)。要访问它,您需要匹配 -- 这在 get 方法中可能会更好,但这一点是有效的。

    match f#get#bar with
      | Some x -> x#doIt
      | None -> failwith "value not initialized"
    

    我不知道你写 class foo barbar 是什么意思,但它是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多