首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在AutoHotKey中“返回”到底是做什么的?

在AutoHotKey中“返回”到底是做什么的?
EN

Stack Overflow用户
提问于 2021-12-16 10:04:16
回答 2查看 875关注 0票数 1

在评论链中,我问:

嗯,那么return就不像其他语言中的闭幕式了吗?

用户回答的问题:

也许可以很容易地将return看作是阻止代码进一步执行的东西。#如果指向不关心return或任何与代码执行相关的内容,因为它们与代码执行无关。它们只是一种标记,将代码的不同部分包含在其中。

我有两个问题要问:

  1. 如果return只是阻止代码进一步执行的东西,那么它与exit有什么不同呢?它们都是流控件,对确定脚本的顶部(自动执行部分)起着重要作用。我看到很多人都有这个问题。
  2. 如果return不像闭幕式,那么为什么在很多地方都会出现一个结束括号呢?特别是在没有子例程涉及的情况下,如形式定义中所描述的那样。以热键中的这个例子为例: #n:运行记事本返回
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-16 13:19:38

在AHK中,return是您从其他编程语言中学习到的return。它只是控制流,一般来说,在AHK中,遗留语法不同于您可能使用的其他语言。

returnexit有什么不同?

如果我们不试图从一个函数返回一个值,并且只是对控制流感兴趣,那么就没有什么区别了。但区别就在这里。

您确实可以用exit结束热键标签,这与用return结束热键标签是一样的。

从文件中:

如果没有调用者返回,则Return 将执行 Exit instead.".

我想用return结束热键标签只是惯例。

因此,基本上说,如果return不打算做exit,这两者是有区别的。

那这会是什么时候?

例如:

代码语言:javascript
运行
复制
MsgBox, 1
function()
MsgBox, 3
return ;this does an exit

function()
{
    MsgBox, 2
    return ;this does a return
}

第一个return没有要返回的调用方,因此它将执行一个exit

然而,第二个return确实有一个调用方要返回,因此它将返回到那里,然后执行第三个消息框。

如果我们用一个exit替换了第二个返回,那么当前的线程就会被退出,第三个消息框就永远不会显示了。

下面是与遗留标签相同的示例:

代码语言:javascript
运行
复制
MsgBox, 1
gosub, label
MsgBox, 3
return ;this does an exit

label:
    MsgBox, 2
return ;this does a return

我展示这个,因为它们非常接近热键标签,而热键标签是你很好奇的事情。

在这个特定的示例中,如果不存在行MsgBox, 3,则用exit替换第二个return将产生相同的最终结果。但这只是因为代码执行将在第一个return上结束。

如果return不像闭幕式,那么为什么在很多地方都会出现一个结束括号呢?

在AHK v1中,热键和热字符串的工作方式类似于标签,标签是遗留的。标签不像现代的{ }那样关心函数

所以我们需要一些东西来阻止代码的执行。Return就是这么做的。

请考虑以下示例:

代码语言:javascript
运行
复制
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文档中的v2。

票数 3
EN

Stack Overflow用户

发布于 2022-07-04 00:49:21

Return从函数(用funcname(...)语法调用)或子例程(用Gosub label调用)返回。子程序/函数可以调用其他子程序/函数,因此用Return而不是Exit来结束它们很方便。Exit结束当前的执行线程,不会将控制流传输回调用方。

对于函数,Return也可以返回一个值。

Return不类似于结束括号。结束括号只能出现在函数的末尾,并暗示一个Return,但您也可以在函数中的任何地方使用Return。在If语句中返回函数以“退出”函数是很常见的,可能是如果某个参数的值无效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70377117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档