我一直在阅读ocaml
文档,但我不能解释{ x with ... }
如何围绕可变字段工作。 closest I've found说
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,版本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
支持,实现可以重用,而不是分配新的可变存储。
答案 0 :(得分:3)
我见过的所有地方,“浅拷贝”意味着,简单地将所有组件转移,就像通过赋值一样,即使在所有字段总是可变的语言中,如Java。所以在这种情况下(let tmp=e in { f0=tmp.f0; … fi-1=tmp.fi-1; fi=x; fi+1=tmp.fi+1; …; fn=tmp.fn })
正是它的意思。