当您在内置命令(不是函数)中省略参数时,您真正要做的是传递一个空字符串。这两种情况是有区别的:
- 使用可选参数定义函数,后跟强制参数。
- 调用带有省略的可选参数的命令,后跟未被省略的可选参数。
对于 MsgBox 和 MouseGetPos,所有参数都是可选的。
AutoHotkey 1.1 允许以下用户定义函数:
Foobar(1,, 3)
Foobar(baz, blah="something", blivet="")
{
MsgBox baz=%baz%, blah=%blah%, blivet=%blivet%
}
这只有在参数的默认值已知时才有可能(即在动态调用函数时不行)。
允许省略中间参数
如果您不想更改参数的顺序或使三个中的两个可选,您可以做一些“杂耍”:
Foobar("baz", "blivet")
Foobar("baz", "blah", "blivet")
Foobar(baz, p2, p3="omitted")
{
blah := p3="omitted" ? "default" : p2 ; optional
blivet := p3="omitted" ? p2 : p3 ; required
MsgBox baz=%baz%, blah=%blah%, blivet=%blivet%
}
这样,该函数始终需要至少两个参数,并且在调用该函数时,您实际上可以省略中间的参数。但是,您需要保留一个(字符串或数字)值来指示参数已被省略。AutoHotkey 1.1 可以通过使用可变参数函数来避免这种情况:
Foobar("baz", "blivet")
Foobar("baz", "blah", "blivet")
Foobar(baz, p2, p3*)
{
blah := p3.MaxIndex() ? p2 : "default" ; optional
blivet := p3.MaxIndex() ? p3[1] : p2 ; required
MsgBox baz=%baz%, blah=%blah%, blivet=%blivet%
}
或者,可以将函数声明为Foobar(baz, p*)
,并且您可以将条件基于p.MaxIndex()
(附加参数的数量),但在这种情况下,只有第一个参数是强制性的。