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.call の self は s:A ではなくて .call を呼び出した s:B になります。
[self を s:A にして呼び出す]
この時に self を s: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 がなにを指すのかは少し注意してやる必要がありそう。