Ocaml 如何在模块中定义静态变量?
因此,基本上我试图在Ocaml 如何在模块中定义静态变量?,ocaml,Ocaml,因此,基本上我试图在模块中定义一个静态(全局)变量 在OCaml中编程时,我经常使用class。现在,当我尝试使用模块系统时,我发现我不知道如何在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
模块中定义一个静态(全局)变量
在OCaml
中编程时,我经常使用class
。现在,当我尝试使用模块
系统时,我发现我不知道如何在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\u l
将创建l
的新实例,这不是我需要的
谁能给我一些关于在模块
中定义静态
变量的指导
IMHO,重新调用函数集将创建一个新的l实例,这不是我需要的
你的直觉是错误的
l := x :: !l
将x
前置到当前值l
,并将新创建的值分配到l
,该值实际上是一个指针
不会创建新实例
代码中的问题在于get\l
。将在定义后立即对其进行评估。例如,在时间点,当l
仍然为空时。这意味着您需要将解引用延迟到真正需要该值的时间点。因此,您真正想要的是:
let get_l () =
!l
及
现在,get_l()
只有在您完成这两个任务后才会取消引用l
引用。@computereasy这不是ocaml的错误!在一种情况下,get\u l
仅仅是一个值(在定义它时计算),是不可变的,因此它不应该给您一个更新的l
。@ivg版本使用的函数可以查找l
所指的当前值。
let () =
let () = set_l 1 in
let () = set_l 2 in
print_int (List.length (get_l ()))