问题描述
用户回复:
我对此有两个问题:
如果
return
只是阻止代码执行的东西,那么它与exit
有什么不同?它们都是流控制,起着决定The Top of the Script (the Auto-execute Section)的作用。我看到很多人都有这个问题。如果
return
打得不像右括号,那么为什么在很多地方出现它预计会有右括号?特别是当不存在涉及的子例程时,就像在形式定义中描述的那样。以Hotkeys中的此为例:#n:: Run Notepad return
推荐答案
在AHK中return
是您从其他编程语言中学到的return
。这只是AHK中控制流和一般遗留语法与您可能习惯于从其他语言中使用的不同。
如果我们不尝试从函数返回值,而只是对控制流感兴趣,则没有太大区别。但区别是存在的。
热键标签确实可以用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
结束。在AHK v1中,热键和热串的工作方式类似于labels,而标签是遗留的。标签不像现代的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。
这篇关于在AutoHotKey中‘Return’到底是做什么的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!