我具有以下形式的功能:
function! s:my_function(dict_arg)
let darg = copy(a:dict_arg)
func! my_inner_func(cond)
if a:cond ==# 'a'
execute darg.a
elseif a:cond ==# 'b'
execute darg.b
elseif a:cond ==# 'c'
execute darg.c
endif
endfunc
return function('my_inner_func')
endfunc
传递给dict_arg
参数的参数将是一些用a
,b
和c
键的dict,它们的值是表示将根据特定cond
执行的Ex命令的字符串。 (条件)。
外部函数s:my_function
的目的是生成一个Funcref,它将基于darg.a
执行适当的Ex命令(darg.b
,darg.c
或cond
),该命令本身由其他人确定。变量。
所以我的问题是,我不知道如何从darg
内部引用在s:my_function
范围内定义的局部变量my_inner_func
。调用该函数时,出现错误[ C0]。如果我没有定义局部变量E121: Undefined variable: darg
,它也不会起作用(相同的错误),而是尝试例如执行darg
。
我可以通过将execute a:dict_arg.b
定义为全局变量来解决它,就像darg
一样,然后再执行let g:darg = copy(a:dict_arg)
。但是,当然,我想避免这种情况。
在类似Python的系统中,这种类型的词法范围解析是自动的。但是VimL很好。任何帮助或指示,将不胜感激。
在类似Python的系统中,这种类型的词法范围解析是自动的
在VimScript中,除了lambdas,它是manual。您必须显式添加execute g:darg.a
关键字:
closure
外部函数s:my_function的目的是生成一个Funcref,它将基于cond来执行适当的Ex命令(darg.a,darg.b或darg.c),而cond本身是由其他变量确定的。
IMO,最好使用“ partial”。
func! my_inner_func(cond) closure
...
endfunction