`return` 在 AutoHotKey 中究竟做了啥?
Posted
技术标签:
【中文标题】`return` 在 AutoHotKey 中究竟做了啥?【英文标题】:What exactly does `return` do in AutoHotKey?`return` 在 AutoHotKey 中究竟做了什么? 【发布时间】:2022-01-19 10:21:45 【问题描述】:In a comment chain,请问:
嗯,所以
return
不像其他语言中的右括号那样播放?
用户回答:
可能很容易将
return
视为阻止代码执行进一步的东西。 #IfDirectives 不关心return
s,或任何与代码执行相关的东西,因为它们与代码执行无关。它们只是将代码的不同部分包含在其中的标记
我有两个问题:
如果return
只是阻止代码执行进一步的东西,那么它与exit
有什么不同?它们都是流控制,起到确定The Top of the Script (the Auto-execute Section) 的作用。我看到很多人都有这个问题。
如果return
不像右括号那样播放,那么为什么它会出现在很多地方,人们希望它是右括号呢?特别是当没有子程序涉及时,如正式定义中描述的那样。以Hotkeys中的这个例子为例:
#n::
Run Notepad
return
【问题讨论】:
【参考方案1】:在 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。
【讨论】:
所以我认为这是因为在 v1 中没有右括号,我们需要使用return
吗?为什么 AutoHotKey 的作者一开始不使用括号?在您的示例中,如果我们按 c
,它将打开 Chrome,同时按 n
,这将打开记事本,对吗?
虽然 v1/legacy 与此相关,但括号不包含代码执行只是 labels 的情况,如答案中所述。我不知道为什么会这样,就是这样。可能只是源于一些旧的旧遗产,但我真的不知道。在示例中,不,热键标签,例如 n::
不发送击键。它们只是表明如果按下该键,代码将在此处运行。我的示例试图表明,代码执行不断下降并执行所有这些行,因为我们从未以 return.
结束代码执行
啊,我明白了。所以像n::
这样的标签也不像一个左括号。它只是标记“如果你按下键,代码将从这里向下执行,直到return
”。如果一个标签正在另一个执行过程中,它就会被简单地解雇。对吗?
是的,没错。以上是关于`return` 在 AutoHotKey 中究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章