basyura's blog

あしたになったらほんきだす。

dictionary function の動的呼び出し

忘れないうちにメモ。

let s:hoge = {}
function s:hoge.hello(...)
  return a:1.name
endfunction

echo call(s:hoge.hello , [{'name' : 'hogehoge'}] , s:hoge)

vimdoc-ja の help を引いてみる

もちろん clone 済みですよね?(https://github.com/vim-jp/vimdoc-ja.git)

:help call()@ja
call({func}, {arglist} [, {dict}])      *call()* *E699*
    リスト|List|{arglist}の要素を引数として関数{func}を呼ぶ。
    {func}は|Funcref|でも関数の名前でもよい。
    a:firstlineとa:lastlineにはカレント行が代入される。
    呼び出した関数の戻り値を返す。
    {dict}は"dict"属性つきの関数用で、これがローカル変数"self"に代
    入される。|Dictionary-function|を参照。

おもしろくなってきたので、oo っぽく

let s:hoge = {}
function s:hoge.hello(...)
  return a:1.name
endfunction

function! s:main()
  " インスタンス生成のイメージ
  let h = copy(s:hoge)
  " インスタンスメソッドの動的呼び出しイメージ
  echo call(h.hello , [{'name' : 'hogehoge'}] , h)
endfunction

call s:main()

さらにおもしろくなってきたので、Ruby の __send__ っぽく

let s:hoge = {}
function s:hoge.hello(...)
  return a:1.name
endfunction
function s:hoge.__send__(method, ...)
  return call(self[a:method] , a:000 , self)
endfunction

function! s:main()
  " インスタンス生成のイメージ
  let h = copy(s:hoge)
  " インスタンスメソッドの動的呼び出しイメージ
  echo h.__send__('hello' , {'name' : 'fugafuga'})
endfunction

call s:main()


( ゚∀゚)o彡゜oo! oo!