在AutoHotkey中,您可以在内置函数调用的中间省略参数:
MsgBox, 4,, Blah
MouseGetPos,,, MouseWin
您还可以使用可选参数àlaC ++:
创建函数Foobar(baz, blah="something")
{
MsgBox baz=%baz%, blah=%blah%
}
但docs表示在创建函数时,默认参数后不能有非默认参数。尝试这样做会导致解释器错误,说明默认参数后的第一个非默认参数需要默认值。
为什么呢?这样称呼它有什么问题?
Foobar(baz, blah="something", blivet)
{
MsgBox baz=%baz%, blah=%blah%, blivet=%blivet%
}
Foobar("cat",,"dog")
有没有办法在中间创建带可选参数的函数?
答案 0 :(得分:7)
当你在内置命令(不是函数)中省略参数时,你真正在做的是传递一个空字符串。这两种情况之间存在差异:
使用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使用variadic function:
可以避免这种情况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()
(附加参数的数量),但在这种情况下,只有第一个参数是必需的。
答案 1 :(得分:1)
两个选项......(解决方法......)
<强> 1。将所有参数的默认值放在右边......
Foobar(baz, blivet, blah="something")
{
MsgBox baz=%baz%, blah=%blah%, blivet=%blivet%
}
Foobar("cat","dog")
<强> 2。定义一个&#34;空&#34;默认值...
Foobar(baz, blah="something", blivet="")
{
MsgBox baz=%baz%, blah=%blah%, blivet=%blivet%
}
Foobar("cat",,"dog")
我无法说出为什么会这样,但就目前而言,没有别的办法......(除非你修改了自动键:P) 我想内置函数不会以同样的方式工作。