F# オブジェクト式に変更可能な状態を持たせたいと考えています。最初のアプローチは、次のように ref セルを使用することです。
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 オブジェクトもヒープに割り当てられているため、2 番目のバージョンが高速になる理由はありません。ただし、使用するのは少し魅力的です。
フィードバックや提案をありがとう