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
相关产品推荐
相关产品推荐

