在 Ocaml 中删除变量

Deleting variables in Ocaml

我找不到以前问过这个问题的人:

OCaml 中如何释放变量? Python 有 del 我认为 OCaml 有类似的功能,但我找不到它。甚至可以删除变量吗?

如果没有,那么如何在 OCaml 中管理变量?

我不可能在 OCaml 中用关键字放弃变量。但是,您可以这样使用变量范围:

let a = b in
print_endline a ;
...

不同于:

( let a = b in
  print_endline a ) ;
...

在第一个中,您可以在 ... 中访问 a,但在第二个中则不行。 您还可以隐藏一个变量:

let a = b in
print_endline a ;
let a = () in
...

...中,将无法访问原来的a:有一个名为a的新变量,旧的被“删除”(正确的说法是阴影)。

OCaml 还允许您在任何地方声明变量,无论表达式多么“小”:

print_endline (let a = b in a) ;
...

是完全有效的,而a只定义在( )里面。打印的值将与第一个示例中的值相同。

OCaml 中最接近 Python 变量的对应物是引用(它是记录的可变字段)。在Python中,一般会删除一个变量,让GC干活,尽快回收变量内容。您也可以在 OCaml 中通过为引用分配一个新值来执行此操作。通常,您会使用 option 类型或其他一些容器来存储引用中的值,例如

let foo = ref None
let () = 
  foo := Some big_data_structure; (* assigning *)
  foo := None (* deleting *)

let foo = ref []
let () =
  foo := [some; huge; list];
  foo := []

如果我们要谈论不可变变量,那么您还可以通过确保它们的生命周期尽可能短来加快它们的收集。因此,将不可变值的转换结果绑定到与之前相同的变量(也称为阴影、重新绑定、隐藏)是一种常见的做法,例如,

let names = ["ahura"; "bahman"; "dana"; "ervin"]
let names = List.map String.capitalize names
(* previous names are no longer accessible here, so GC can collect them *)

这里我们确保旧的 names 不可访问,以便 GC 可以在最近的次要集合中收集它们。