`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 不关心returns,或任何与代码执行相关的东西,因为它们与代码执行无关。它们只是将代码的不同部分包含在其中的标记

我有两个问题:

    如果return 只是阻止代码执行进一步的东西,那么它与exit 有什么不同?它们都是流控制,起到确定The Top of the Script (the Auto-execute Section) 的作用。我看到很多人都有这个问题。

    如果return 不像右括号那样播放,那么为什么它会出现在很多地方,人们希望它是右括号呢?特别是当没有子程序涉及时,如正式定义中描述的那样。以Hotkeys中的这个例子为例:

    #n::
    Run Notepad
    return
    

【问题讨论】:

【参考方案1】:

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

returnexit 有何不同?

如果我们不尝试从函数返回值,而只是对控制流感兴趣,那么差别不大。但是区别就在那里。

你确实可以用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 中究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

AutoHotkey

AutoHotkey触发鼠标键

autoHotKey 一些脚本积累

这个 return 语句究竟指示程序做啥?

notepad++中如何让autohotkey 代码高亮

return和finally究竟谁先执行,还有return是怎么返回数据的