本文介绍了在AutoHotKey中‘Return’到底是做什么的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

In a comment chain,我问:

用户回复:

我对此有两个问题:

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

  2. 如果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’到底是做什么的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 23:45