在评论链中,我问:
嗯,那么
return
就不像其他语言中的闭幕式了吗?
用户回答的问题:
也许可以很容易地将
return
看作是阻止代码进一步执行的东西。#如果指向不关心return
或任何与代码执行相关的内容,因为它们与代码执行无关。它们只是一种标记,将代码的不同部分包含在其中。
我有两个问题要问:
return
只是阻止代码进一步执行的东西,那么它与exit
有什么不同呢?它们都是流控件,对确定脚本的顶部(自动执行部分)起着重要作用。我看到很多人都有这个问题。return
不像闭幕式,那么为什么在很多地方都会出现一个结束括号呢?特别是在没有子例程涉及的情况下,如形式定义中所描述的那样。以热键中的这个例子为例:
#n:运行记事本返回发布于 2021-12-16 13:19:38
在AHK中,return
是您从其他编程语言中学习到的return
。它只是控制流,一般来说,在AHK中,遗留语法不同于您可能使用的其他语言。
return
和exit
有什么不同?
如果我们不试图从一个函数返回一个值,并且只是对控制流感兴趣,那么就没有什么区别了。但区别就在这里。
您确实可以用exit
结束热键标签,这与用return
结束热键标签是一样的。
从文件中:
如果没有调用者返回,则Return
将执行 Exit
instead.".
我想用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
,则用exit
替换第二个return
将产生相同的最终结果。但这只是因为代码执行将在第一个return
上结束。
如果
return
不像闭幕式,那么为什么在很多地方都会出现一个结束括号呢?
在AHK v1中,热键和热字符串的工作方式类似于标签,标签是遗留的。标签不像现代的{ }
那样关心函数。
所以我们需要一些东西来阻止代码的执行。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文档中的v2。
发布于 2022-07-04 00:49:21
Return
从函数(用funcname(...)
语法调用)或子例程(用Gosub label
调用)返回。子程序/函数可以调用其他子程序/函数,因此用Return
而不是Exit
来结束它们很方便。Exit
结束当前的执行线程,不会将控制流传输回调用方。
对于函数,Return
也可以返回一个值。
Return
不类似于结束括号。结束括号只能出现在函数的末尾,并暗示一个Return
,但您也可以在函数中的任何地方使用Return
。在If
语句中返回函数以“退出”函数是很常见的,可能是如果某个参数的值无效。
https://stackoverflow.com/questions/70377117
复制相似问题