忘れないうちにメモ。
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!