伪开关状态机

Pseudoswitch Statemachine

我正在尝试使用 lua "pseudo"开关来设置状态机,但遇到了一些困难。

假设状态机应该检测几种颜色组合和return一种特定的其他颜色。 (只是举例说明原理)

总有一个 "old" 状态和一个 "new" 状态。

local state = {{},{}}
state["red"]["blue"] = function()
   stop_a_timer() 
   return "purple"
end
state["blue"]["green"] = function()
   call_a_function()
   return "cyan"
end
state["green"]["red"] = function()
   call_another_function()
   return ("yellow")
end

function state_handler(old_state, new_state) 
   if not (state[old_state][new_state]()) then
     return false
   end
end

到目前为止,检查多个值非常简单,但我如何检查 "false" 值?

如何设置状态为:

(old_state == "green") and (new_state != "blue")

当然

state["green"][(not "blue")] = function () whatever end

无效。

您可以发明自己的符号。例如。 "!blue" 代表蓝色以外的任何东西:

state["green"]["!blue"] = function () whatever end

那么 state_handler 看起来像:

function state_handler(old_state, new_state) 
  for selector, fun in pairs(state[old_state]) do
    if selector == new_state then
      fun()
    end
    if selector:find "^!" and selector ~= ("!" .. new_state) then
      fun()
    end
  end
end

此处仅 new_state 支持我们的符号。如果 old_state 也需要它,则必须调整此功能。