私はgradbotが言ったことをサポートすることしかできません-突然変異が必要なとき、私は好みlet mutable
ます。
実装と2つの違いに関して-ref
セルは基本的に、可変レコードフィールドを含む非常に単純なレコードによって実装されます。あなたはそれらを自分で簡単に書くことができます:
type ref<'T> = // '
{ mutable value : 'T } // '
// the ref function, ! and := operators look like this:
let (!) (a:ref<_>) = a.value
let (:=) (a:ref<_>) v = a.value <- v
let ref v = { value = v }
2つのアプローチの顕著な違いは、let mutable
可変値をスタックに(C#の可変変数として)ref
格納する一方で、ヒープに割り当てられたレコードのフィールドに可変値を格納することです。これはパフォーマンスにいくらかの影響を与えるかもしれませんが、私には数字がありません...
このおかげで、を使用ref
する可変値にエイリアスを設定できます。つまり、同じ可変値を参照する2つの値を作成できます。
let a = ref 5 // allocates a new record on the heap
let b = a // b references the same record
b := 10 // modifies the value of 'a' as well!
let mutable a = 5 // mutable value on the stack
let mutable b = a // new mutable value initialized to current value of 'a'
b <- 10 // modifies the value of 'b' only!