从互斥候选项列表中执行其中一个实例.
Switch SwitchValue, CaseSense { Case CaseValue1: Statements1 Case CaseValue2a, CaseValue2b: Statements2 Default: Statements3 }
要比较的值, 如下面的备注所述.
可以选择指定以下值之一, 以强制所有值作为字符串进行比较:
"On"
或 1
(True
): 每次比较区分大小写.
"Off"
或 0
(False
): 字母 A-Z 被视为等同于其小写字母.
"Locale"
: 根据当前用户地区的规则, 每次比较都是不区分大小写的. 有关详情, 请参阅 StrCompare.
如果存在, 则对 SwitchValue 进行一次计算并与每个实例值进行比较, 直到找到匹配为止, 然后执行该实例. 否则, 将执行第一个计算为 true(非零和非空) 的实例. 如果没有匹配的实例并且存在 Default
, 则执行它.
与 =
和 ==
运算符一样, 当省略 CaseSense 时, 如果 SwitchValue 和实例值都是纯数字, 或者其中一个是纯数字而另一个是数字字符串, 则会执行数字比较. 每个实例都是单独考虑的, 并不影响用于其他实例的比较类型.
如果 CaseSense 参数存在, 所有的值都作为字符串而不是数字进行比较, 如果 SwitchValue 或 CaseValue 被计算为一个对象, 则会抛出一个 TypeError.
每个实例最多可以列出 20 个值. 每个值必须是一个表达式, 但可以是一个原义数字, 加引号的字符串或变量. Case
和 Default
必须以冒号 :
终止.
每个实例的第一个语句可以在 Case
下面, 也可以在同一行, 挨着冒号. 每个实例都隐式地以下一个 Case
/Default
或右大括号结束. 与在其他一些语言中找到的 switch 语句不同, 没有隐式的落下直通和不使用 Break(除非用于跳出封闭循环).
由于所有实例都包含在同一个块中, 因此在一个实例中定义的标签可以是另一个案例的 Goto 的目标. 但是, 如果标签位于 Case
或 Default
的正上方, 则它将指向前一个实例的结尾, 而不是下一个实例的开头.
Default
不需要列在最后.
要测试这个例子, 输入 [ 后面跟着下面列出的一个缩写, 任何其他 5 个字符, 或 Enter/Esc/Tab/.; 或等待 4 秒.
~[:: { Hook := InputHook("V T5 L4 C", "{enter}.{esc}{tab}", "btw,otoh,fl,ahk,ca") Hook.Start() Hook.Wait() switch Hook.EndReason { case "Max": MsgBox 'You entered "' Hook.Input '", which is the maximum length of text.' case "Timeout": MsgBox 'You entered "' Hook.Input '" at which time the input timed out.' case "EndKey": MsgBox 'You entered "' Hook.Input '" and terminated the input with ' Hook.EndReason '.' default: ; 匹配 switch Hook.Input { case "btw": Send "{backspace 4}by the way" case "otoh": Send "{backspace 5}on the other hand" case "fl": Send "{backspace 3}Florida" case "ca": Send "{backspace 3}California" case "ahk": Send "{backspace 3}" Run "https://www.autohotkey.com" } } }