3

コンパイラは、レコードが拡張されたときにメモリ内に新しい場所を作成しますか (ディープ コピー?)、またはコンパイラはレコードを変更可能にして値を変更しますか?

例えば:

type MyRecord = { A : string
                ; B : string
                }

let record = { A = "A"; B = "B" }

let record = { record with A = "new A" } //copy or overwrite? 

上書きrecordしているので、コンパイラはコピーまたは上書きしますか? いずれにしてもパフォーマンスの問題はありますか?

4

2 に答える 2

6

コピーを作成します。

コピーして更新するレコード式

*コピーと更新のレコード式は、次のように記述されたレコード式であるかのように精緻化されます。

let v = expr in { field-label1 = expr1 ; …; field-labeln = exprn; F1 = v.F1; ...; FM = v.FM }

ここで、F1 ... FM は、フィールド初期化子で定義されていない R のフィールドであり、v は新しい変数です。*

于 2012-07-23T18:59:43.400 に答える
2

これ

type T = {
  A : string
  B : string
}

let x = { A = "a"; B = "b" }
let y = { x with A = "aa" }

これに等しい

class T {
    public readonly string A;
    public readonly string B;
    public T(string a, string b) {
        A = a;
        B = b;
    }
}

var x = new T("a", "b");
var y = new T("aa", x.B);
于 2012-07-23T19:11:24.323 に答える