SML / NJ - 关于“:=”运算符

时间:2013-02-27 11:34:36

标签: sml smlnj

我对:=运营商进行了一些检查,我想确保我做得好。

让 -

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值。

我是对的吗?

2 个答案:

答案 0 :(得分:4)

分配不分配新内存。在r1 := !r2之后,引用r1“指向”从2获取的值r2,而不是r2本身。因此,稍后更新r2不会影响它。

如果你想要这样的效果,那么你必须使用另一个间接,例如int ref ref类型。

答案 1 :(得分:0)

是。 r1r2已初始化为指向不同的数据结构。 :=运算符只是更改左侧指向的ref结构的值。如果您希望r1r2指向相同的引用结构,则最初可能尚未定义r1,之后将其定义为val r1 = r2。在最初定义之后,无法在ML中分配变量。