9月28日发布的1.1.31.00版AutoHotkey 终于增加了Switch支持!
Switch [v1.1.31+]
从互斥候选项列表中执行一种情况。
Switch [SwitchValue]
{
Case CaseValue1:
Statements1
Case CaseValue2a, CaseValue2b:
Statements2
Default:
Statements3
}
小贴士
- SwitchValue是可选的,如果填写了SwitchValue则对SwitchValue求值一次,并与每个case值进行比较,直到找到匹配,然后执行该case。如果不写SwitchValue,则执行第一个结果为true(非零和非空)的情况。如果没有匹配的,并且存在缺省值,则执行缺省值。
- Switch语句字符串比较时是大小写敏感的。
- Case和Default必须以:结尾,每个Case后面最多可以列20个值,每个值必须是一个表达式,如数字、带引号的字符串或变量。
- 每个Case的第一句可以写在Case下面,也可写在Case的同一行的冒号后面。每个Case语句都隐式地以下一个Case/Default或右大括号结束。不像其他一些语言中的Switch语句,它不存在隐式的跳转,也不使用Break(除了跳出一个封闭循环之外)。
- 由于所有的Case都包含在同一个块中,所以某一Case的标签可以成为另一Case跳转(Goto)的目标。但是,如果标签被放置在Case或Default的正上方,它的目标是前一个Case的结束,而不是下一个Case的开始。
- Default不需要列在最后。
举个栗子
weekendOrWeekday1()
{
day:= A_WDay ;1 位数表示的当前星期几(1-7)。 在所有区域设置中 1 都表示星期天.
Switch [day]
{
Case 1,7:
return "weekend"
Default:
return "weekday"
}
}
MsgBox % weekendOrWeekday1()
使用if语句的示范
weekendOrWeekday2()
{
day:= A_WDay ;1 位数表示的当前星期几(1-7)。 在所有区域设置中 1 都表示星期天.
if (day == 1 or day == 7)
{
return "周末"
}
return "平日"
}
再示范下三元运算符形式
weekendOrWeekday3()
{
day:= A_WDay ;1 位数表示的当前星期几(1-7)。 在所有区域设置中 1 都表示星期天.
return (day == 1 or day == 7) ? "weekend" : "weekday"
}
在2010年我曾经模仿实现过Switch语句,局限是仅支持数值型,示例如下:
value := A_Hour // 6
Switch1(value)
return
Switch1(value)
{
If IsLabel( "Case_" . value)
Goto Case_%value%
Else
Goto Case_Default
Case_0:
Msgbox, Good Night
return
Case_1:
Msgbox, Good Morning
return
Case_2:
Msgbox, Good afternoon
return
Case_3:
Msgbox, Good Evening
return
Case_Default:
msgbox, Good Day
return
}