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

組み込みコマンド(関数ではない)でパラメーターを省略すると、実際には空の文字列が渡されます。これら 2 つのケースには次のような違いがあります。

  • オプションのパラメーターとそれに続く必須パラメーターを使用して関数を定義する。
  • 省略されたオプション パラメータを指定してコマンドを呼び出し、その後に省略されていないオプション パラメータが続く。

MsgBox と MouseGetPos の両方で、すべてのパラメーターはオプションです。

AutoHotkey 1.1 では、ユーザー定義関数で次のことが可能です。

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

これは、パラメータのデフォルト値がわかっている場合にのみ可能です (つまり、関数を動的に呼び出す場合ではありません)。


中間パラメータの省略を許可する

パラメータの順序を変更したくない場合、または 3 つのうち 2 つをオプションにしたくない場合は、ちょっとした「ジャグリング」を行うことができます。

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%
}

このように、関数は常に少なくとも 2 つのパラメーターを必要とし、関数を呼び出すときに途中のパラメーターを実質的に省略できます。ただし、パラメータが省略されたことを示すために、(文字列または数値) 値を予約する必要があります。これは、可変引数関数を使用して 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

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 に答える