2013-02-27 95 views
0

我對:=運營商做了一些檢查,我想確保我得到它。SML/NJ - 關於「:=」運營商

讓 -

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

我對不對?

回答

4

賦值不分配新內存。在r1 := !r2之後,參考r1「點」到取自r2的值2,而不是r2本身。因此,稍後更新r2不會影響它。

如果你想要這樣的效果,那麼你必須使用另一個間接尋址,例如,一個int ref ref類型。

0

是的。 r1r2被初始化爲指向不同的數據結構。 :=運算符只是更改左側指向的ref結構的值。如果您希望r1r2指向相同的ref結構,您可能最初沒有定義r1,然後稍後將其定義爲val r1 = r2。在最初定義ML後,不可能將其分配給ML中的變量。