是否可以绕过模块的签名以进行调试?

时间:2017-11-29 22:18:50

标签: ocaml

我尝试理解模块的某些函数的奇怪行为,这些函数依赖于此模块的签名所掩盖的此模块的变量。我想在程序的某些点打印这个变量,但由于它被屏蔽了,我不知道如何访问它。

此外,这个模块是我不想修改和重新编译的大项目的一部分。

是否可以访问此变量以进行调试?甚至做了暂时肮脏的事情?

编辑:这里有一些代表性的代码

module type S = sig val f : unit -> unit end
module M : S = struct let x = ref 0 let f () = Format.printf "%d@." !x; incr x end

如何访问M.x

1 个答案:

答案 0 :(得分:0)

当然可以!

首先,您可以隐藏签名一段时间:

module type S = sig val f : unit -> unit end
module M (* : S *) = struct
  let x = ref 0
  let f () = Format.printf "%d@." !x; incr x 
end

或者您可以在签名中显示x

module type S = sig 
  val x : int ref 
  val f : unit -> unit 
end
module M : S = struct
  let x = ref 0
  let f () = Format.printf "%d@." !x; incr x 
end

根据您的喜好。在这两种情况下,M.x都可以在模块外部使用。

你甚至可以像这样定义一个函数print_x

module type S = sig 
  val print_x : unit -> unit 
  val f : unit -> unit 
end
module M : S = struct
  let x = ref 0
  let print_x () = Format.printf "%d@." !x
  let f () = Format.printf "%d@." !x; incr x 
end

并在任意位置使用M.print_x ()