Switch

将一个值与多个实例进行比较, 并执行第一个匹配的语句.

Switch SwitchValue, CaseSense
{
Case CaseValue1:
    Statements1
Case CaseValue2a, CaseValue2b:
    Statements2
Default:
    Statements3
}

参数

SwitchValue

如果 CaseSense 省略, 将执行第一个计算为 true(非零和非空) 的实例. 否则, 对 SwitchValue 进行一次计算并与每个实例值进行比较, 直到找到匹配为止, 然后执行该实例.

如果没有匹配的实例并且存在 Default, 则执行它.

CaseSense

类型: 字符串整数(布尔值)

如果省略, 则默认为 On. 否则, 指定以下值之一, 以强制所有值作为字符串进行比较:

On1(true): 每次比较区分大小写.

Off0(false): 每次比较不区分大小写, 即字母 A-Z 被视为等同于其小写字母.

Locale: 根据当前用户地区的规则, 每次比较都是不区分大小写的. 例如, 在大多数英语及西欧地区, 不仅将 A-Z 视为等同于它们的小写形式, 同时也将非-ASCII 字母(如 Ä 和 Ü) 视为等同的. 根据被比较字符串的性质, LocaleOff 慢 1 到 8 倍.

CaseValueN

要检查或比较的值, 取决于 SwitchValue 是否存在.

备注

=== 运算符一样, 当省略 CaseSense 时, 如果 SwitchValue 和实例值都是纯数字, 或者其中一个是纯数字而另一个是数字字符串, 则会执行数字比较. 每个实例值都是单独考虑的, 并不影响用于其他实例值的比较类型.

如果 CaseSense 参数存在, 所有的值都作为字符串而不是数字进行比较, 如果 SwitchValueCaseValue 被计算为一个对象, 则会抛出一个 TypeError.

如果忽略 CaseSense 参数, 默认情况下字符串比较是区分大小写的.

每个实例最多可以列出 20 个值. 每个值必须是一个表达式, 但可以是一个原义数字, 加引号的字符串或变量. CaseDefault 必须以冒号(:) 终止.

每个实例的第一个语句可以在 Case 下面, 也可以在同一行, 挨着冒号. 每个实例都隐式地以下一个 Case/Default 或右大括号结束. 与在其他一些语言中找到的 switch 语句不同, 没有隐式的落下直通和不使用 Break(除非用于跳出封闭循环).

由于所有实例都包含在同一个块中, 因此在一个实例中定义的标签可以是另一个案例的 Goto 的目标. 但是, 如果标签位于 CaseDefault 的正上方, 则它将指向前一个实例的结尾, 而不是下一个实例的开头.

Default 不需要列在最后.

If, Else, 区块

示例

将一个数字与多个实例进行比较, 并显示第一个匹配的消息框.

switch 2
{
case 1: MsgBox "no match"
case 2: MsgBox "match"
case 3: MsgBox "no match"
}

SwitchValue 参数可以省略, 以执行第一个计算结果为 true 的情况.

str := "the red fox jumps over the lazy brown dog"
switch
{
case InStr(str, "blue"):  MsgBox "false"
case InStr(str, "red"):   MsgBox "true"
case InStr(str, "green"): MsgBox "false"
}

要测试这个例子, 输入 [ 后面跟着下面列出的一个缩写, 任何其他 5 个字符, 或 Enter/Esc/Tab/.; 或等待 4 秒.

~[::
{
    ih := InputHook("V T5 L4 C", "{enter}.{esc}{tab}", "btw,otoh,fl,ahk,ca")
    ih.Start()
    ih.Wait()
    switch ih.EndReason
    {
    case "Max":
        MsgBox 'You entered "' ih.Input '", which is the maximum length of text'
    case "Timeout":
        MsgBox 'You entered "' ih.Input '" at which time the input timed out'
    case "EndKey":
        MsgBox 'You entered "' ih.Input '" and terminated it with ' ih.EndKey
    default:  ; 匹配
        switch ih.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"
        }
    }
}