我如何在 NetLogo 中执行 SWITCH 或 SELECT CASE?

How do I do a SWITCH or SELECT CASE in NetLogo?

NetLogo 没有原生的 SWITCH、SWITCH-CASE 或 SELECT-CASE 类型的多重条件,我如何在没有大量嵌套 IF-ELSE 语句的情况下做同样的事情?

我们可以用一连串嵌套的 IF-ELSE 语句来模拟 SWITCH 语句,格式化后不会乱七八糟,而且实际上易于阅读和编辑。

我们将格式化 IF-ELSE 语句链,目标如下:

  • 避免过度缩进,
  • 避免代码行过长
  • 让它在其他语言中看起来更像 switch
  • 重新排列大小写不会破坏语法
  • 有默认情况

SWITCH 语句

外观如下:

;; example of SWITCH style conditional block 
if-else [ criteria 1 ] [ action-1 ][
if-else [ criteria 2 ] [ action-2 ][
if-else [ criteria 3 ] [ action-3 ][
if-else [ true ]       [ default-action ][
]]]] 

其他注意事项

一些程序员可能会发现默认操作测试 true 并在最后的“IF”为空时保留“else 块”是令人反感的。你可以做你喜欢的事。我发现将默认大小写明确化,使所有操作的格式完全相同,并避免在末尾出现一堆尴尬的标点符号。

  • 避免行太长——这样会更难阅读
  • 保持条件简短——如果需要,将它们包装在记者中。
  • 操作要简短——如果需要,将它们包装在过程中。
  • 这有助于代码读起来更像一个故事而不是代码。

从NetLogo 6.1开始,NetLogo支持多大小写ifelse,可以像其他语言的switch语句一样使用。这里是 an example from the docs:

ask patches [
  let choice random 4
  (ifelse
    choice = 0 [
      set pcolor red
      set plabel "r"
    ]
    choice = 1 [
      set pcolor blue
      set plabel "b"
    ]
    choice = 2 [
      set pcolor green
      set plabel "g"
    ]
    ; elsecommands
    [
      set pcolor yellow
      set plabel "y"
  ])
]

这是重写为使用它的其他答案中的示例:

;; example of SWITCH style conditional block 
(ifelse 
  (criteria-1) [ action-1 ]
  (criteria-2) [ action-2 ]
  (criteria-3) [ action-3 ]
               [ default-action ]
) 

这不需要在最后一行有 ] 的“多重关闭”,所以总体上对我来说看起来更干净。