【问题标题】:What exactly does `return` do in AutoHotKey?`return` 在 AutoHotKey 中究竟做了什么?
【发布时间】:2022-01-19 10:21:45
【问题描述】:

In a comment chain,请问:

嗯,所以return 不像其他语言中的右括号那样播放?

用户回答:

可能很容易将return 视为阻止代码执行进一步的东西。 #IfDirectives 不关心returns,或任何与代码执行相关的东西,因为它们与代码执行无关。它们只是将代码的不同部分包含在其中的标记

我有两个问题:

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

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

    #n::
    Run Notepad
    return
    

【问题讨论】:

    标签: return autohotkey


    【解决方案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”。如果一个标签正在另一个执行过程中,它就会被简单地解雇。对吗?
    • 是的,没错。
    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 2012-07-23
    • 2016-09-10
    • 2023-03-15
    • 2012-10-17
    • 2021-06-04
    • 1970-01-01
    • 2018-07-30
    相关资源
    最近更新 更多