我对:=
运营商进行了一些检查,我想确保我做得好。
让 -
val r1 = ref 1 ; (* !r1 = 1 *)
val r2 = ref 2 ; (* !r2 = 2 *)
val r3 = ref 3 ; (* !r3 = 3 *)
r1 := !r2 ; (* !r1 = 2 *)
r2 := !r3 ; (* !r2 = 3 *)
!r1 ; (* still !r1 = 2 *)
显然我认为r2 := !r3 ;
会导致!r1
值也发生变化,但未发生变化,因此r1 := !r2 ;
似乎没有将r1
指向同一个值地址为r2
,但只为!r1
分配新内存并在其中设置2
值。
我是对的吗?
答案 0 :(得分:4)
分配不分配新内存。在r1 := !r2
之后,引用r1
“指向”从2
获取的值r2
,而不是r2
本身。因此,稍后更新r2
不会影响它。
如果你想要这样的效果,那么你必须使用另一个间接,例如int ref ref
类型。
答案 1 :(得分:0)
是。 r1
和r2
已初始化为指向不同的数据结构。 :=
运算符只是更改左侧指向的ref结构的值。如果您希望r1
和r2
指向相同的引用结构,则最初可能尚未定义r1
,之后将其定义为val r1 = r2
。在最初定义之后,无法在ML中分配变量。