我想在 F# 对象表达式中有一个可变状态。第一种方法是使用参考单元格,如下所示:
type PP =
abstract member A : int
let foo =
let a = ref 0
{ new PP with
member x.A =
let ret = !a
a := !a + 1
ret
}
printfn "%A" foo.A
printfn "%A" foo.A
printfn "%A" foo.A
printfn "%A" foo.A
一种不同的方法如下:
type State(s : int) =
let mutable intState = s
member x.state
with get () = intState
and set v = intState <- v
[<AbstractClass>]
type PPP(state : State) =
abstract member A : int
member x.state
with get () = state.state
and set v = state.state <- v
let bar n =
{ new PPP(State(n)) with
member x.A =
let ret = x.state
x.state <- ret + 1
ret
}
let barA1 = bar 0
printfn "%A" barA1.A
printfn "%A" barA1.A
printfn "%A" barA1.A
printfn "%A" barA1.A
哪个版本的性能可能更高(我需要在性能关键部分更新 x.state <- ret + 1 的状态)?我的猜测是 State 对象也分配在堆上,所以没有理由第二个版本应该更快。但是使用起来更有吸引力。
感谢您的任何反馈和建议