我一直在阅读ocaml
文档,但我不能解释{ x with ... }
如何适用于可变字段。该closest I've found说可变记录字段和{x带...}
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
字段没有提到共享存储空间或可以引用嵌套记录。当我测试(使用“OCaml的顶层,版本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
支持,实现可以重用,而不是分配新的可变存储。
所以,你只是希望我们确认 '{É具有f = X}' 是'有效语法糖(让{F0 = tmp.f0 TMP = E; ... FI-1 = TMP。 fi-1; fi = x; fi + 1 = tmp.fi + 1; ...; fn = tmp.fn})'... etc? –
@RobertHarvey,其他文档的指针或如何阅读这些文档的解释会有所帮助,但任何知道什么是和不是未定义行为的人都会有所帮助。 –