我尝试理解模块的某些函数的奇怪行为,这些函数依赖于此模块的签名所掩盖的此模块的变量。我想在程序的某些点打印这个变量,但由于它被屏蔽了,我不知道如何访问它。
此外,这个模块是我不想修改和重新编译的大项目的一部分。
是否可以访问此变量以进行调试?甚至做了暂时肮脏的事情?
编辑:这里有一些代表性的代码
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
?
答案 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 ()
。