在 AHK 中,return 是您从其他编程语言中学到的 return。只是 AHK 中的控制流和一般的旧语法与您在其他语言中可能习惯的不同。
return 与 exit 有何不同?
如果我们不尝试从函数返回值,而只是对控制流感兴趣,那么差别不大。但是区别就在那里。
你确实可以用exit结束一个热键标签,它和用return结束是一样的。
从文档中:
“如果没有要返回的调用者,Return 将改为执行 Exit。”。
我想用return结束热键标签只是惯例。
所以基本上说,如果return 不打算做exit,两者之间是有区别的。
那会是什么时候呢?
例如:
MsgBox, 1
function()
MsgBox, 3
return ;this does an exit
function()
{
MsgBox, 2
return ;this does a return
}
第一个return 没有可返回的调用者,因此它将执行exit。
然而,第二个return 确实有一个调用者要返回做,所以它会返回那里,然后执行第三个消息框。
如果我们将第二个返回值替换为 exit,则当前线程将直接退出,而第三个消息框将永远不会显示。
下面是与旧标签完全相同的示例:
MsgBox, 1
gosub, label
MsgBox, 3
return ;this does an exit
label:
MsgBox, 2
return ;this does a return
我之所以展示这个,是因为它们非常接近热键标签,而热键标签是您经常想知道的东西。
在此特定示例中,如果不存在 MsgBox, 3 行,则将第二个 return 替换为 exit 将产生相同的最终结果。但这只是因为代码执行将在第一个return处结束。
如果return 的播放方式不像右括号,那么为什么它会出现在很多地方需要右括号呢?
在 AHK v1 中,热键和热字串的工作方式类似于 labels,并且标签是旧版。标签不关心 { }s,就像现代的 functions 一样。
所以我们需要一些东西来停止代码执行。 Return 就是这样做的。
考虑以下示例:
c::
MsgBox, % "Hotkey triggered!"
gosub, run_chrome
;code execution not ended
n::
MsgBox, % "Hotkey triggered!`nRunning notepad"
Run, notepad
;code execution not ended
run_chrome:
MsgBox, % "Running chrome"
run, chrome
WinWait, ahk_exe chrome.exe
WinMove, ahk_exe chrome.exe, , 500, 500
;code execution not ended
show_system_uptime:
MsgBox, % "System uptime: " A_TickCount " ms"
;code execution not ended
我们不会在任何标签处结束代码执行。因此,代码执行会渗入代码的其他部分,在这种情况下,会渗入其他标签。
尝试运行热键,看看代码执行如何渗入其他标签。
因此,代码执行需要以某种方式结束。
如果标签支持使用{ },它确实是保持代码执行在需要的地方的解决方案。
事实上AHK v2 热键和热字符串不再是标签(它们只是相似的)。在 v2 中使用 { } 实际上是正确的方法(如果您不使用它们,脚本甚至不会运行)。
请参阅 AHK v2 文档中的 hotkeys。