You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OCaml ref引用比较困惑:同值引用地址为何不等?如何判同对象?

OCaml引用比较的常见困惑解析

为什么r1 == r2返回false?

你代码里的r1和r2是两个独立创建的引用对象——每次调用ref v,OCaml都会在内存中分配一块新的空间来存储这个引用,哪怕它们的contents都指向同一个v的值。

换句话说,ref v的作用是创建一个新的引用容器,把v的值放进去。你调用了两次ref v,就得到了两个不同的容器,它们的内存地址自然不一样,所以用==(物理相等,比较内存地址)判断时返回false。

再明确=和==的区别

  • r1 = r2:结构相等,对引用类型来说,会比较两个引用的contents值是否相等
  • r1 == r2:物理相等,判断两个值是否是内存中的同一个对象(地址完全相同)

如何检查两个ref指向同一个对象?

还是用==,但要确保它们确实是同一个引用的别名。比如:

let v = 1;;
let r1 = ref v;;
let r2 = r1;;  (* r2是r1的别名,指向同一个引用对象 *)
r1 == r2;;     (* 此时返回true *)

这种情况下,r1和r2共享同一个内存地址的引用,==就会正确返回true。

内容的提问来源于stack exchange,提问作者RBB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:12:03