
1 no1xsyzy 2021-01-28 11:10:50 +08:00 1#. Finite State Machine (FSM) 2#. retry flag (reverse also ok) 1 retry_2_thru_4 = true while (retry_2_thru_4) { 2 3 if (4) retry_2_thru_4 = false; } 5 |
3 no1xsyzy 2021-01-28 11:38:02 +08:00 @bytesfold 第二种方法很正常,从很久以前(从 Dijkstra 反对 goto 观点被广泛使用之后)就是这么用的了 如果你觉得不够优雅,那就把 234 封装到一个函数里去,甚至把循环也带进去,跳出直接 return 。 第一种方法就是无限 goto 制,其实单这个还没到该用 FSM 的程度。 这就是个很简单的逻辑 |
4 yuelang85 2021-01-28 11:55:28 +08:00 你把每一步封装成一个函数,然后: func_list = [ (func_1, None), (func_2, func_1), (func_3, func_1), (func_4, func_2), ] for f, f_err in func_list: try: f() except: f_err() |
5 ytymf 2021-01-28 12:16:30 +08:00 上状态机吧,没那么难,画好状态以及状态迁移图,能理顺就能写好。 |
6 frostming 2021-01-28 13:02:41 +08:00 |
7 est 2021-01-28 13:20:47 +08:00 |
8 freelancher 2021-01-28 13:42:30 +08:00 我是写 SHELL 脚本的。12345 每一步的最后给一个状态码。 然后 4 的状态码为 0 是成功。为 1 是错误的。然后写一个==判断就可以了。如果错了再回 2 步骤。 思路是这样。我不知道大家能不能懂的我意思。 |
9 cpstar 2021-01-28 14:13:25 +08:00 @yuelang85 如果这样的话,那就可以继续封装函数了 invoke(func, succ, err) { if (func()) succ() else err() } 然后就成了 invoke(func_1, invoke(func_2, invoke(func_3, invoke(func_4, null, func_2), null), null), null) null 根据实际情况继续配置 [套娃警告] |
10 cpstar 2021-01-28 14:14:39 +08:00 感觉 LZ 的想法应该是 4 失败了,要回退到 2 运行之前的状况 |
12 deplives 2021-01-28 16:15:23 +08:00 如果 12345 当成成不同的状态,不就是个状态机了? |
13 zepc007 2021-01-28 18:26:16 +08:00 jump,jump,jump |
14 q197 2021-01-28 19:29:07 +08:00 goto 完美 |
15 ideno 2021-01-28 19:44:02 +08:00 int nProc = 0; while (true) { swith(nProc) { case 0: doProc0(); case 1: doProc1(); case 2: doProc2(); case 3: doProc3(); case 4: if(!doProc4()) {nProc=2; continue;} } break; } @freelancher 说的大概这么个意思(不是正确语法) |
16 HelloViper 2021-01-29 10:11:38 +08:00 transitiOns==0.8.1 |