回答:
はい、関数でオプションの引数を取ることができます。pythonの方法ほど便利ではありませんが、これがあなたのやり方です:
function FooBar(...) " This is like *args in python
echom a:0 " a:0 contains an integer which is the number of arguments passed to the function
echom a:1 " a:1 contains the first argument passed, a:2 contains the second and so on
echo a:000 " a:000 contains a list of all arguments that were passed to the function
endfunction
この方法では、最大20個の引数しか使用できないことに注意してください。
関連するヘルプトピック:
:help :function
:help function-argument
パーティーに少し遅れましたが、私のお気に入りのものが見当たりませんでした
function! FunctionName(arg1,...)
let arg2 = get(a:, 1, 0)
let arg3 = get(a:, 2, 0)
if arg2
"Do stuff with arguments"
else
"Do stuff without arguments"
endif
endfunction
ここでget(a:, n, default)
取得しますnth
返すオプションの引数default
それが存在しない場合はを。
let a:arg=
vim ではもうできません。let l:arg=
またはのようなものを使用する必要がありますlet arg=
。github.com/vim/vim/commit/…を
このパターンにより、各引数に意味のある名前を割り当て、提供されなかった引数にデフォルト値を提供できます。
function FunctionName(foo, ...)
let bar = a:0 >= 1 ? a:1 : 0
let baz = a:0 >= 2 ? a:2 : 0
...
" Code that makes use of a:foo, bar and baz
Boris Brodskiが指摘したように:
a:0
渡されたオプションの引数の数を数えます
a:1
、a:2
、...私たちはオプションの引数にアクセスしてみましょう必須の引数(
foo
上記の例のみ)はカウントされません
condition ? result_if_true : result_if_false
は条件(3項)式で、最初の項が真かどうかに応じて2番目または3番目の項に評価されます。
したがって、3番目の引数が指定されていない場合baz
、デフォルト値のが使用されます0
。
上記の例に関する懸念の1つは、プレフィックスをa:foo
使用してのみアクセスでき、a:
プレフィックスbar
をbaz
使用せずにアクセスできることです。これはあまり一貫性がないため、次のようにすべての引数をローカル変数に引き出すことをお勧めします。
function FunctionName(...)
let foo = a:1 " Will throw an error if no arg was provided
let bar = a:0 >= 2 ? a:2 : 0
let baz = a:0 >= 3 ? a:3 : 0
...
" Code that makes use of foo, bar and baz
(技術的には、l:
接頭辞を使用して関数内のローカル変数を参照できます。たとえばl:baz
、これは冗長なので、お勧めしません。)
ただし、可能な限りこのフォームを使用することをお勧めします。
function! s:FunctionName(...)
を!
使用すると、実行時に関数を再定義できます(たとえば、スクリプトをリロードするなど)。またs:
、関数をスクリプトスコープに制限します。関数がスクリプト内の他の場所からのみ参照されている場合、グローバル名前空間の汚染(および衝突のリスク)を回避します。一般に、グローバルに表示する必要がない場合に関数を定義するのに好ましい方法です。;-)
a:0
固定の名前付きパラメーターは含まれません。(VIM 8.0でテスト済み)a:1
内の最初のパラメーター...
私はvimscriptに精通していませんが、これは私がそれを行う方法です:
function Func(foo, ...)
if a:0 < 1
let bar = "Unspecified bar"
else
let bar = a:1
endif
if a:0 < 2
let baz = "Unspecified baz"
else
let baz = a:2
endif
echo a:foo
echo bar
echo baz
endfunction
するとcall Func("Hello", "World")
、「Hello」、「World」、「Unspecified baz」が出力されることがわかります。
これはvim関数の可変引数機能を使用しており、任意の数の追加引数を関数に渡すことができます。引数は変数に保存され、a:0
(追加の引数リストの長さ)に応じて、対応する引数またはデフォルト値に設定されます。
Vim 8.1.1310から、Vimは実際のオプションの関数引数もサポートします。
ただし、ほとんどのvimインストールではまだサポートされていません。また、neovimはその機能も提供していません。
からの例:help optional-function-argument
:
function Something(key, value = 10)
echo a:key .. ": " .. a:value
endfunction
call Something('empty') "empty: 10"
call Something('key', 20) "key: 20"