所以基本上我试图在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
变量的指南吗?
答案 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
引用。