5

私はドキュメントを読んでいますが、変更可能なフィールドの周りocamlでどのように機能するかを説明する部分はできません。私が見つけた最も近いもの{ x with ... }は言う

6.7 式

expr := ...
    ∣ { expr with  field =  expr  { ; field =  expr }  [;] }

...

記録

この式は、等しい値を{ expr with field1 = expr1 ; … ; fieldn = exprn }持つ新しいレコードを作成し、他のすべてのフィールドはレコードと同じ値を持ちます。つまり、 に初期化されたフィールドを除いて、レコードの浅いコピーを返します。 fields field1 … fieldnexpr1 … exprnexprexprfield1 … fieldnexpr1 … 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、実装が新しい可変ストレージを割り当てる代わりに再利用できる によってサポートすることはできません。

4

1 に答える 1

3

私が見たどこでも、「浅いコピー」は、Java のようにすべてのフィールドが常に変更可能な言語であっても、すべてのコンポーネントを代入のように単純に転送することを意味します。したがって、この場合(let tmp=e in { f0=tmp.f0; … fi-1=tmp.fi-1; fi=x; fi+1=tmp.fi+1; …; fn=tmp.fn })はまさにそれが意味するものです。

于 2012-11-08T01:38:46.550 に答える