我有一个模拟器,它使用两个成员将某些状态作为记录保存:一个 Class1 的对象和一系列 Class2 的对象。
当模拟运行时,输入被读取,并且根据输入,这些对象的一些方法被调用。这种方法改变了它们的内部状态。
我正在学习 F#,我了解不可变数据的重要性。然而,考虑到这种状态的复杂性(远不止这里公开的),我认为拥有这些具有内部可变状态的对象并不是什么大不了的事。至少它是隐藏的。
然而,问题是另一个问题。这可能很简单。
在两次迭代之间,我丢失了对“一个”和“多个”对象的更改!
我猜 InvokeMethodOn (显然是简化的)获取了这些对象的副本。
我意识到我需要一些参考,但是......我在这里有点迷失......状态应该有参考成员吗?InvokeMethodOn 应该通过 ref 传递吗?他们都是?那么“多”序列呢?
编辑:可能有数百万个“许多”对象。它们中的每一个都有 1 或 2 KB 的状态(现在只是保存在一个字节的 blob 中)。
编辑:将“许多”更改为数组(并按照建议使用 Array.iter)解决了这个问题。谢谢大家!
type State = {
one : Class1
many : Class2 seq
}
type Simulator() = class
member x.run(state : State) =
// ....
while ...
let input = ReadInput
if someFuncOf(input)
then InvokeMethodOn(state.one, input)
else Seq.iter (fun x -> InvokeMethodOn(x, input)) state.many
member x.InvokeMethodOn obj input =
obj.ChangeInternalState input