Vim 7.4.2137 で funcref() が追加された
少し前なんですが Vim 7.4.2137 で任意の関数の Funcref
を返す funcref()
という組み込み関数が追加されました。
これは、既存の function()
と同じように使用することが出来ます。
function! s:plus(a, b) return a:a + a:b endfunction let s:plus3 = funcref("s:plus", [3]) echo s:plus3(2) " => 5
[function()
と funcref()
の違い]
function()
と funcref()
の違いですが、function()
は対象の関数が上書きされた場合に上書きされた関数を呼び出すのに対して、funcref()
は上書きされる前の関数を呼び出すという違いがあります。
function! s:test() return "homu" endfunction let s:function = function("s:test") let s:funcref = funcref("s:test") " 両方共 s:test() を呼び出す echo s:function() " => homu echo s:funcref() " => homu " s:test() を書き換える function! s:test() return "mami" endfunction " 上書きした s:test() を呼ぶ echo s:function() " => mami " 上書きされる前の s:test() を呼ぶ echo s:funcref() " => homu " s:test を削除 delfunction s:test " Error " echo s:function() " OK echo s:funcref() " => homu
このように関数が書き換わったのに関わらず『funcref()
を呼び出した時』の関数を呼び出します。
また funcref()
は組み込み関数に対しては使用できません。