Object 使用外部函数作为方法的ocaml对象
有时,我们希望使用ocaml模块作为接口为某些C代码编写绑定,或者优化C中某个对象的某些方法。但是,我们不能在对象之前定义外部函数,因为它需要对象的类型,也不能定义对象,因为它需要调用外部函数Object 使用外部函数作为方法的ocaml对象,object,ocaml,external,Object,Ocaml,External,有时,我们希望使用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类型关闭或转义其作用域