25 · Máquinas de Estado
Máquinas indexadas por estado
new_static crea una máquina con propiedad y testigo de estado. send la consume y devuelve el tipo del estado destino; un guard fallido devuelve la máquina y el evento originales. Las funciones pueden exigir Order<.Paid>. erase_state devuelve una máquina dinámica cuando ya no necesitas comprobación estática.
En esta página
new_static crea una máquina con propiedad y testigo de estado. send la consume y devuelve el tipo del estado destino; un guard fallido devuelve la máquina y el evento originales. Las funciones pueden exigir Order<.Paid>. erase_state devuelve una máquina dinámica cuando ya no necesitas comprobación estática.
Ejemplo completo
Máquinas indexadas por estado.
machine Order {
state Draft, Paid, Shipped
event Pay, Ship
initial Draft
Draft -> Paid on Pay
Paid -> Shipped on Ship
}
fn ship(sink order: Order<.Paid>) -> Order<.Shipped> =
order.send(Order.Event.Ship)
let paid = Order.new_static().send(Order.Event.Pay)
let shipped = ship(sink paid)
let ordinary = shipped.erase_state()
match ordinary.state {
.Shipped => print("shipped"),
_ => assert(false)
}
// A guarded transition returns the original machine and event on failure.
machine Door {
state Closed, Open
event Unlock
initial Closed
Closed -> Open on Unlock if false
}
match Door.new_static().send(Door.Event.Unlock) {
.Ok(open) => { let ordinary = open.erase_state(); assert(false) },
.Err({ machine: closed, event: retry }) => {
let ordinary = closed.erase_state()
match retry { .Unlock => print("closed") }
}
}
Reglas y comportamiento
Estados y eventos tipados · Documentación
Desde un checkout del repositorio:
zolo examples/features/state_indexed_machines.zolo
Consulta también