如何创建空引用?我的意思是lika作为
let x = ref Null
或
let x = ref None
或
let x = ref ()
答案 0 :(得分:4)
ML中没有这样的东西。类型t ref
始终的值包含t
类型的值。这样就避免了空指针异常的诅咒。
如果你真的需要一个可以为空的引用,那么你必须创建一个t option ref
类型的引用:
let r : int option ref = ref None
...
r := Some 5
类型系统确保您不会忘记处理无案例,例如匹配:
match !r with
| Some n -> ...
| None -> (* What now? *)
但你应该很少需要这样的东西。如果你发现自己想要一个选项参考,那么你应该首先尝试重构问题。
答案 1 :(得分:1)
很难说出你在问什么。在OCaml中没有预定义的名为Null
的预定义。有一些名为None
的东西,实际上你可以说let x = ref None
。你也可以说let x = ref ()
。然而,很难想象你想要这样做的情况。由于()
是其类型的唯一值,因此您永远不能将x
设置为任何其他值。因此没有理由使用参考。
以下是展示如何使用ref None
的会话。
# let x = ref None;;
val x : '_a option ref = {contents = None}
# x := Some 5;;
- : unit = ()
# x;;
- : int option ref = {contents = Some 5}
# x := None;;
- : unit = ()
# x;;
- : int option ref = {contents = None}
一般来说,像int option
这样的选项类型允许您拥有int值(如Some 5
)或没有值(None
)。使用像int option ref
这样的引用会为您提供一个可变值,您可以在这两个值之间进行更改。
在我看来,您正在尝试重现您在其他语言中使用的模式。如果可能的话,你应该尝试以自己的方式学习OCaml。