为什么AutoHotkey不支持参数列表中间的默认参数?

时间:2012-10-02 05:26:45

标签: default-value autohotkey optional-parameters

在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")

有没有办法在中间创建带可选参数的函数?

2 个答案:

答案 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) 我想内置函数不会以同样的方式工作。