在 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 可以在最近的次要集合中收集它们。
我找不到以前问过这个问题的人:
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 可以在最近的次要集合中收集它们。