如何在模块中定义静态变量?

时间:2015-06-26 17:22:56

标签: ocaml

所以基本上我试图在module中定义一个静态(全局)变量。

我在class编程时经常使用OCaml。现在当我尝试使用Module系统时,我只知道我不知道如何在OCaml中定义静态(全局)变量。对我感到羞耻..

以下是一个例子:

module Util = struct

  let l = ref [] 

  let get_l = 
      !l
  let set_l x =
     l := x::!l

end

open Util 

let () =
  let () = set_l 1 in
  let () = set_l 2 in
  print_int (List.length get_l)

恕我直言,重新调用函数set_l将创建l的新实例,这不是我需要的..

有人可以给我一些关于在static中定义module变量的指南吗?

1 个答案:

答案 0 :(得分:3)

  

恕我直言,重新调用函数set_l会创建一个l的新实例,这不是我需要的..

你的直觉是不正确的。

l := x :: !l

x添加到当前值l,并将此新创建的值分配给l,这实际上是指针。

不会创建新实例。

代码中的问题出在get_l中。它将在let l = ref []定义之后进行评估。例如,在l仍为空的时间点。这意味着,您需要将解除引用延迟到实际需要该值的时间点。所以,你真正想要的是以下内容:

let get_l () = 
  !l

并且

let () =
  let () = set_l 1 in
  let () = set_l 2 in
  print_int (List.length (get_l ()))

现在,只有在您完成这两项任务后,get_l ()才会取消引用l引用。