私はドキュメントを読んでいますが、変更可能なフィールドの周りocaml
でどのように機能するかを説明する部分はできません。私が見つけた最も近いもの{ x with ... }
は言う
6.7 式
expr := ... ∣ { expr with field = expr { ; field = expr } [;] }
...
記録
この式は、等しい値を
{ expr with field1 = expr1 ; … ; fieldn = exprn }
持つ新しいレコードを作成し、他のすべてのフィールドはレコードと同じ値を持ちます。つまり、 に初期化されたフィールドを除いて、レコードの浅いコピーを返します。fields field1 … fieldn
expr1 … exprn
expr
expr
field1 … fieldn
expr1 … exprn
mutable
この「浅いコピー」の言い回しは、言及されていないフィールドがストレージ スペースを共有している、またはネストされたレコードを参照している可能性があることを意味すると解釈できます。私がテストすると(「The OCaml toplevel, version 4.00.1」を使用して)、このように
type t = { mutable x : int; mutable y: int }
let a = {x=42;y=123}
let b = { a with y=124}
let _ = a.x <- 43
let _ = Printf.printf "b.x=%d\n" b.x
;;
b.x
エイリアスではないことを示す結果が得られますa.x
。
b.x=42
type t = { mutable x : int; mutable y : int; }
val a : t = {x = 43; y = 123}
val b : t = {x = 42; y = 124}
それは私をとても幸せにしますが、私はそれを確認したいです
{ e with fi=x }
のようなものの効果的な構文糖衣です
(let tmp=e in { f0=tmp.f0; … fi-1=tmp.fi-1; fi=x; fi+1=tmp.fi+1; …; fn=tmp.fn })
また、そのmutable
フィールドはref
、実装が新しい可変ストレージを割り当てる代わりに再利用できる によってサポートすることはできません。