autohotkey函数 (一)
基本使用举例
定义
Add(x, y)
{
return x + y ; "Return" 期望 表达式.
}
调用
Var := Add(2, 3) ; 数字 5 将被保存到 Var.
Add(2, 3) ; 无返回值
注意
由于函数调用是 表达式, 在其参数列表中的任何变量名称都不应该括在百分号中. 与之相比, 原义的字符串应该括在双引号中.
if InStr(MyVar, "fox")
MsgBox The variable MyVar contains the word fox.
最后, 可以在任何命令的参数中调用函数 (除了像 StringLen 的中的那些 OutputVar 和 InputVar 参数).
然而, 不支持 表达式 的参数必须加上 "% " 前缀, 例如:
MsgBox % "The answer is: " . Add(3, 2)
在原生支持表达式的参数中也允许加上 "% " 前缀, 不过它会被简单的忽略了
参数
定义函数时, 其参数都在其名称后面的括号中列出 (在其名称和开括号之间不能含有空格). 如果函数不接受任何参数,请把括号留空,例如:GetCurrentTimestamp()。
ByRef参数
从函数的角度看, 参数本质上是 局部变量, 除非它们被定义为 ByRef, 例如:
Swap(ByRef Left, ByRef Right)
{
temp := Left
Left := Right
Right := temp
}
在上述例子中, ByRef 的使用让每个参数变成从调用者传递进来的变量的一个别名. 换句话说, 参数和调用者的变量都引用内存中相同的内容. 这样使得 Swap 函数可以通过移动 Left 的内容到 Right 中来修改调用者的变量, 反之亦然.
有点类似于C++中的引用
- IsByRef() 函数可以用来判断调用者是否为指定的 ByRef 参数提供了变量。
- 不能传递 Clipboard, 内置变量 或 环境变量 给函数的 ByRef 参数, 即使脚本中没有 #NoEnv 时.
- 尽管函数可以递归调用它自己,但是如果它传递它自己的一个局部变量或非 ByRef 参数给自己的 ByRef,那么新一层的 ByRef 参数将引用它自己那个名称的局部变量而不是之前层的。然而, 当函数传递给它自己 全局变量, 静态变量 或 ByRef 参数时不会产生这样的问题.
可选参数
定义函数时, 可以把它的一个或多个参数标记为可选的. 这可以通过在参数后添加一个等号(在 v1.1.09+ 中还可以为 :=)跟着默认值完成. 后面的函数中其 Z 参数被标记为可选的:
Add(X, Y, Z:=0) {
return X + Y + Z
}
注意
ByRef 参数 也支持默认值; 例如: Func(ByRef p1 = “”). 每当调用者省略这样的参数时, 函数会创建一个包含默认值的局部变量; 换句话说, 函数表现的就像关键字 “ByRef” 没有那样
可以使用对象和数组返回多值甚至是命名值
Test1 := returnArray1()
MsgBox % Test1[1] "," Test1[2]
Test2 := returnArray2()
MsgBox % Test2[1] "," Test2[2]
Test3 := returnObject()
MsgBox % Test3.id "," Test3.val
returnArray1() {
Test := [123,"ABC"]
return Test
}
returnArray2() {
x := 456
y := "EFG"
return [x, y]
}
returnObject() {
Test := {id: 789, val: "HIJ"}
return Test
}
可变参数函数
Join(sep, params*) {
for index,param in params
str .= param . sep
return SubStr(str, 1, -StrLen(sep))
}
MsgBox % Join("`n", "one", "two", "three")
注意
调用可变参数函数时, 通过保存在函数的最后参数中的对象可以访问剩余的参数. 函数的首个剩余参数在 params[1], 第二个在 params[2] 等等. 和所有的标准对象一样, 使用 params.MaxIndex() 可以确定最大的索引值 (这里为参数的数目). 但是如果没有参数, MaxIndex 会返回空字符串.
“可变” 参数只可以出现在形式参数列表的末尾.