Object 使用外部函数作为方法的ocaml对象

Object 使用外部函数作为方法的ocaml对象,object,ocaml,external,Object,Ocaml,External,有时,我们希望使用ocaml模块作为接口为某些C代码编写绑定,或者优化C中某个对象的某些方法。但是,我们不能在对象之前定义外部函数,因为它需要对象的类型,也不能定义对象,因为它需要调用外部函数 一种解决方案是使用递归模块,但这很容易使源代码的大小变大,并且变得非常不可读。外部函数也会进入模块名称空间,需要再次隐藏。那么,什么是更短、更具可读性的解决方案呢?我找到了如何使用一流的模块直接在对象内部定义外部函数的方法。第一个类需要第一个类模块使用的模块类型。这是通用的,可多次用于任何类型的外部功能:

有时,我们希望使用ocaml模块作为接口为某些C代码编写绑定,或者优化C中某个对象的某些方法。但是,我们不能在对象之前定义外部函数,因为它需要对象的类型,也不能定义对象,因为它需要调用外部函数


一种解决方案是使用递归模块,但这很容易使源代码的大小变大,并且变得非常不可读。外部函数也会进入模块名称空间,需要再次隐藏。那么,什么是更短、更具可读性的解决方案呢?

我找到了如何使用一流的模块直接在对象内部定义外部函数的方法。第一个类需要第一个类模块使用的模块类型。这是通用的,可多次用于任何类型的外部功能:

module type External = sig
    type e
    val stub : e
end
之后,您可以像这样声明外部函数:

class c =
  let ext = (module struct
    type e = c -> unit
    external stub : c -> unit = "stub"
  end : External with type e = c -> unit)
  in
object(self:'self)
  method as_c = (self :> c)
  method foo =
    let module E = (val ext)
    in
    E.stub self#as_c
end
或者在方法本身中更为局部,例如:

class c = object(self:'self)
  method as_c = (self :> c)
  method foo =
    let module E = (val (module struct
      type t = c -> unit
      external stub : c -> unit = "stub"
    end) : External with type t = c -> unit)
    in
    E.stub self#as_c
end
注意:as_c方法避免(open)self类型关闭或转义其作用域