`return` 在 AutoHotKey 中到底做了什么?

What exactly does `return` do in AutoHotKey?

,我问:

Hmm, so the return doesn't play like a closing bracket like in other languages?

用户回答:

It's maybe easy to think of return as just something that stops the code execution from going further. #IfDirectives don't care about returns, or anything else related to code execution, because they have nothing to do with code execution. They are kind of just markers that enclose different parts of code within them

我有两个问题:

  1. 如果return is just something that stops code execution from going further, then how is it different to exit? They are both flow controls playing a role to determine The Top of the Script (the Auto-execute Section)。我看到很多人遇到这个问题。

  2. 如果 return 不像右括号那样播放,那么为什么它出现在许多人们期望右括号的地方?特别是在没有子程序涉及的情况下,就像正式定义中描述的那样。以 Hotkeys 为例:

    #n::
    Run Notepad
    return
    

在 AHK return 中,您可以从其他编程语言中学到 return。只是 AHK 中的控制流和一般的遗留语法与您在其他语言中可能习惯的不同。

How is return different from exit?

如果我们不尝试 return 来自函数的值,而只是对控制流感兴趣,则没有太大区别。但是区别还是有的

您确实可以用 exit 结束热键标签,这与用 return 结束一样。
来自文档:
“如果没有调用者 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 没有要 return 的调用者,因此它将执行 exit.
然而,第二个 return 确实有一个 return 的调用者要做,所以它将 return 在那里,然后执行第三个消息框。
如果我们将第二个 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.

结束

If return doesn't play like a closing bracket, then why does it appear in many places one expects a closing bracket?

在 AHK v1 中,热键和热字串的工作方式与 labels, and labels are legacy. Labels don't care about { }s like modern 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