我有一個模擬器,它將一些狀態保存爲兩個成員的記錄:一個Class1對象和一個Class2對象序列。F#改變對象的狀態
當仿真運行時,讀取輸入,並根據輸入,調用這些對象的某些方法。這種方法改變他們的內部狀態。
我正在學習F#,我理解不可變數據的重要性。然而,考慮到這種狀態的複雜性(在此暴露的遠不止這些),我認爲讓這些內部可變狀態的對象不是什麼大問題。至少它是隱藏的。
然而,問題在於另一個問題。這可能很簡單。
在迭代之間,我失去了對「一個」和「多個」對象的更改!
我想InvokeMethodOn(顯然簡化)需要這些對象的副本。
我知道我在這裏需要某種引用,但是......我在這裏有點失落......國家應該有裁判成員? InvokeMethodOn應該通過ref?他們全部?那麼「很多」序列呢?
編輯:可能有數以百萬計的「許多」對象。它們中的每一個都有1或2 KB的狀態(現在只保留在一個字節中)。
編輯:更改「許多」爲一個數組(並按照建議使用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
你的'ChangeInternalState'可能有問題,'seq'因爲'seqs'懶惰需要小心 - 可能最好使用數組/列表 –
'obj.ChangeInternalState'只改變是否正確例如'Class2'內的東西'Class2.mutableValue'?或者你的目標是改變'State.many',使它指向不同的'Class2'對象序列? – bytebuster
第一個假設是正確的:obj.ChangeInternalState只更改內部屬性。在代碼中,我沒有改變「一」或「多」。 – Benedetto