Ho una classe con proprietà che hanno diversi effetti collaterali che si attivano quando vengono chiamati i suoi setter, come gli eventi di modifica attivati e/o le azioni di rendering. Come potrei progettare una funzione che imposti la proprietà solo se il suo valore deve cambiare?F # - Imposta proprietà se modificato
Con arbitri, vorrei solo fare qualcosa di simile:
let setIfChanged (oldVal: Ref<'T>) (newVal: 'T) = if newVal <> !oldVal then oldVal := newVal
let y = ref 0
setIfChanged y 1
Tuttavia, le proprietà non sono mutabili arbitri, e io non riesco a trovare un modo per progettare una cosa che compilerà. Ad esempio,
let setIfChanged oldVal newVal = if newVal <> oldVal then oldVal <- newVal
sarà solo mi dicono che OLDVAL non è mutabile.
C'è un modo per annotare oldVal in modo che sia per proprietà modificabili (impostabili)? O c'è un modo migliore?
beh, è un peccato (normalmente vorrai che il setter sia così intelligente da non fare effetti collaterali quando non c'è nulla di cambiato) non puoi cambiare la fonte - personalmente prenderei in considerazione il confezionamento dei tipi * offendenti * - Tomas risposta sembra un bel modo per farlo * abbreviato * – Carsten