Vim script の closure が利用できるケース
前回『Vim script の closure
は使うべきではない』と言ってたんですが、次のようなコードだと結構有効的だと思います。
function! s:init(value) let value = a:value " 初期値に基づいて関数を定義する function! s:hoge() closure return value + value endfunction function! s:bar(value) closure return value + a:value endfunction endfunction " 任意の値で初期化して関数を定義する call s:init(42) echo s:hoge() " => 84 echo s:bar(-20) " => 22 " 任意の値で関数を書き換える call s:init(-4) echo s:hoge() " => -8 echo s:bar(-20) " => -24
関数内で関数を定義したいときに closure
を利用して関数外の変数を参照しています。
要は『意図して関数を上書きしてる』ようなコードですね。
あまりこのような『関数内で関数を定義する』コードは見かけないんですが、こういう風に closure
を利用して関数を定義すると『スクリプトローカル変数』を隠蔽することが可能になります。
例えば、closure
を使わない場合は、次のように『スクリプトローカル変数』を使わなければなりません。
function! s:init(value) " 関数から参照するためにスクリプトローカル変数を定義する let s:value = a:value function! s:hoge() return s:value + s:value endfunction function! s:bar(value) return s:value + a:value endfunction endfunction
『スクリプトローカル変数を回避する』のであれば確かに closure
はかなり強力な機能であると思う。