You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
4.0 KiB
196 lines
4.0 KiB
function! Sum(x, y, ...) |
|
let l:sum = a:x + a:y |
|
for l:arg in a:000 |
|
let l:sum += l:arg |
|
endfor |
|
return l:sum |
|
endfunction |
|
|
|
function! Prod(x, y, ...) |
|
let l:prod = a:x * a:y |
|
for l:arg in a:000 |
|
let l:prod = l:prod * l:arg |
|
endfor |
|
return l:prod |
|
endfunction |
|
|
|
function! CalculateR(operator, ...) |
|
if a:operator ==# '+' |
|
let l:Fnr = function('Sum') |
|
elseif a:operator ==# '*' |
|
let l:Fnr = function('Prod') |
|
endif |
|
|
|
let l:result = call(l:Fnr, a:000) |
|
return l:result |
|
endfunction |
|
|
|
let s:fnrSum = function('Sum') |
|
let s:fnrProd = function('Prod') |
|
|
|
function! CalculateRs(operator, ...) |
|
if a:operator ==# '+' |
|
let l:Fnr = s:fnrSum |
|
elseif a:operator ==# '*' |
|
let l:Fnr = s:fnrProd |
|
endif |
|
|
|
let l:result = call(l:Fnr, a:000) |
|
return l:result |
|
endfunction |
|
|
|
function! s:sum(...) |
|
let l:sum = 0 |
|
for l:arg in a:000 |
|
let l:sum += l:arg |
|
endfor |
|
return l:sum |
|
endfunction |
|
|
|
function! s:prod(...) |
|
let l:prod = 1 |
|
for l:arg in a:000 |
|
let l:prod = l:prod * l:arg |
|
endfor |
|
return l:prod |
|
endfunction |
|
|
|
let s:fnrSum = function('s:sum') |
|
let s:fnrProd = function('s:prod') |
|
|
|
echo s:fnrSum(1,2,3,4) |
|
echo s:fnrProd(1,2,3,4) |
|
|
|
" let s:sum = function('s:sum') |
|
" let s:prod = function('s:prod') |
|
|
|
let s:sum = '1+2+3+4' |
|
let s:prod = '1*2*3*4' |
|
|
|
echo s:sum(1,2,3,4) |
|
echo s:prod(1,2,3,4) |
|
|
|
" 将函数引用保存在列表中 |
|
let s:operator = [function('s:sum'), function('s:prod')] |
|
function! CalculateA(...) |
|
for l:Operator in s:operator |
|
let l:result = call(l:Operator, a:000) |
|
echo l:result |
|
endfor |
|
endfunction |
|
|
|
" 将函数引用保存在字典中 |
|
let s:dOperator = {'desc': 'some function on varargins'} |
|
let s:dOperator['+'] = function('s:sum') |
|
let s:dOperator['*'] = function('s:prod') |
|
|
|
function! CalculateD(operator, ...) abort |
|
let l:Fnr = s:dOperator[a:operator] |
|
let l:result = call(l:Fnr, a:000) |
|
return l:result |
|
endfunction |
|
|
|
" 保存在成员键中 |
|
let s:dOperator.sumFnr = s:dOperator['+'] |
|
let s:dOperator.prodFnr = s:dOperator['*'] |
|
echo s:dOperator.sumFnr(1, 2, 3, 4) |
|
echo s:dOperator.prodFnr(1, 2, 3, 4) |
|
|
|
" 直接定义函数键 |
|
function s:dOperator.sum(...) |
|
let l:sum = 0 |
|
for l:arg in a:000 |
|
let l:sum += l:arg |
|
endfor |
|
return l:sum |
|
endfunction |
|
|
|
function! s:dOperator.prod(...) |
|
let l:prod = 1 |
|
for l:arg in a:000 |
|
let l:prod = l:prod * l:arg |
|
endfor |
|
return l:prod |
|
endfunction |
|
|
|
echo s:dOperator.sum(1, 2, 3, 4) |
|
echo s:dOperator.prod(1, 2, 3, 4) |
|
|
|
" 不能将字典函数引用赋值给普通函数引用 |
|
" let g:Fnr = s:dOperator.sum |
|
" echo g:Fnr(1,2,3,4) |
|
|
|
" 合法 |
|
let g:Fnr = s:dOperator.sumFnr |
|
echo g:Fnr(1,2,3,4) |
|
|
|
let s:dOperator.PI = 3.14 |
|
function! s:dOperator.area(r) |
|
return self.PI * a:r * a:r |
|
endfunction |
|
|
|
echo s:dOperator.area(2) |
|
|
|
let s:Math = {} |
|
let s:Math.PI = 3.14159 |
|
let s:Math.Area = s:dOperator.area |
|
echo s:Math.Area(2) |
|
|
|
" let g:Fnr = s:dOperator.area |
|
" echo g:Fnr(2) |
|
|
|
function! s:area(width, height) dict |
|
return a:width * a:height |
|
endfunction |
|
|
|
" echo s:area(3, 4) |" 出错 |
|
echo call('s:area', [5, 6], {}) |
|
" echo call('s:area', [5, 6]) |
|
|
|
let s:Rect = {} |
|
let s:Rect.area = function('s:area') |
|
echo s:Rect.area(3, 4) |" 正确 |
|
|
|
function! s:area() dict |
|
return self.width * self.height |
|
endfunction |
|
|
|
let s:Rect.width = 3 |
|
let s:Rect.height = 4 |
|
echo s:Rect.area() |
|
|
|
echo call('s:area', [], s:Rect) |
|
echo call(function('s:area'), [], s:Rect) |
|
|
|
" 调试信息观察 |
|
|
|
function! s:Rect.debug1() dict abort |
|
echo expand('<sfile>') |
|
Hello Vim, 我在这里就是个错误 |
|
endfunction |
|
|
|
function! s:debug2() abort |
|
echo expand('<sfile>') |
|
Hello Vim, 我来这里也是个错误 |
|
endfunction |
|
let s:Rect.debug2 = function('s:debug2') |
|
|
|
function! s:Rect.test() dict " abort |
|
echo expand('<sfile>') |
|
call self.debug1() |
|
call self.debug2() |
|
endfunction |
|
|
|
function! s:test() abort |
|
echo expand('<sfile>') |
|
call s:Rect.test() |
|
endfunction |
|
|
|
function! Test() abort |
|
echo expand('<sfile>') |
|
call s:test() |
|
endfunction |
|
|
|
echo expand('<sfile>') |
|
|
|
" echo s:
|
|
|