# Switch

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

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

## 参数

SwitchValue

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

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

CaseSense

  类型: 整数或字符串

  可以选择指定以下值之一, 以强制所有值作为字符串进行比较:

  `"On"` 或 `1`(`True`): 每次比较区分大小写.

  `"Off"` 或 `0`(`False`): 字母 A-Z 被视为等同于其小写字母.

  `"Locale"`: 根据当前用户地区的规则, 每次比较都是不区分大小写的. 有关详情, 请参阅 StrCompare.

CaseValueN

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

## 备注

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

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

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

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

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

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

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"
            }
        }
    }

dftg