Vim script で辞書関数から辞書関数を呼び出すときの注意

さて、次のように辞書関数を辞書の値をして持ちたい場合があると思います。

let s:A = {}

function! s:A.call()
   " self は s:A ではなくて s:B になる
    echo "self is s:A :" self is s:A
    echo "self is s:B :" self is s:B
endfunction

let s:B = {}

" 辞書関数を別の辞書に割り当てて呼び出したい
let s:B.call = s:A.call
call s:B.call()
" output:
" self is s:A : 0
" self is s:B : 1

この時に s:A.callselfs:A ではなくて .call を呼び出した s:B になります。

[selfs:A にして呼び出す]

この時に selfs:A にして呼び出したい場合は function() を使って s:A を束縛します

let s:A = {}

function! s:A.call()
   " self は s:A になる
    echo "self is s:A :" self is s:A
    echo "self is s:B :" self is s:B
endfunction

let s:B = {}

" function() を使って s:A を束縛する
let s:B.call = function(s:A.call, [], s:A)
call s:B.call()
" output:
" self is s:A : 1
" self is s:B : 0

最近、辞書関数がだいぶ扱いやすくなったんですが、self がなにを指すのかは少し注意してやる必要がありそう。