Как сказал Даниэль, последний подход по сути эквивалентен использованию встроенного ref
.
При использовании ref
вы выделяете два объекта - тот, который вы возвращаете, и саму ячейку ссылки.Вы можете уменьшить это до одного выделенного объекта, используя конкретную реализацию (но я не думаю, что это будет иметь значение на практике):
type Stateful(initial:int) =
let mutable state = initial
interface PP with
member x.A =
let ret = state
state <- state + 1
ret
let foo =
Statefull(0) :> PP // Creates a single object that keeps the state as mutable field
Кроме того, вы используете свойство только для чтения, которое изменяет внутреннийсостояние объекта и каждый раз возвращает новое состояние.Это опасный шаблон, который может привести к путанице - свойства с помощью getter не должны изменять состояние, поэтому вам, вероятно, следует использовать метод (unit -> int
).