6

在 AutoHotkey 中,您可以在内置函数调用中间省略参数,如下所示:

MsgBox, 4,, Blah
MouseGetPos,,, MouseWin

您还可以使用 C++ 中的可选参数创建函数:

Foobar(baz, blah="something")
{
  MsgBox baz=%baz%, blah=%blah%
}

但是文档说,当你创建一个函数时,你不能在默认参数之后有非默认参数。尝试这样做会导致解释器错误,指出默认参数之后的第一个非默认参数需要默认值。

为什么?这样称呼有什么问题?

Foobar(baz, blah="something", blivet)
{
  MsgBox baz=%baz%, blah=%blah%, blivet=%blivet%
}

Foobar("cat",,"dog")

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

4

2 回答 2

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 可以通过使用可变参数函数来避免这种情况:

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()(附加参数的数量),但在这种情况下,只有第一个参数是强制性的。

于 2012-11-04T00:15:18.397 回答
2

两个选项...(解决方法...)

1.把所有有默认值的参数放在右边...

Foobar(baz, blivet, blah="something")
{
  MsgBox baz=%baz%, blah=%blah%, blivet=%blivet%
}

Foobar("cat","dog")

2.定义一个“空”的默认值...

Foobar(baz, blah="something", blivet="")
{
  MsgBox baz=%baz%, blah=%blah%, blivet=%blivet%
}

Foobar("cat",,"dog")

我不能说为什么会这样,但现在,没有其他办法......(除非你修改 autohotkey :P )
我猜内置函数的工作方式不同。

于 2012-10-03T03:23:17.203 回答