我具有以下形式的功能:
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,它们各自的值是表示Ex命令的字符串。根据特定的cond
(条件)执行。
外部函数s:my_function
的目的是基于{{生成一个Funcref,该Funcref将执行适当的Ex命令(darg.a
,darg.b
或darg.c
) 1}},它本身由其他变量决定。
所以我的问题是我不知道如何从cond
内引用在darg
范围内定义的局部变量s:my_function
。该函数被调用时,出现错误my_inner_func
。如果我没有定义局部变量E121: Undefined variable: darg
,而是尝试例如执行darg
,它也将不起作用(相同的错误)。
我可以通过将execute a:dict_arg.b
定义为全局变量(如darg
),然后再进行let g:darg = copy(a:dict_arg)
来解决它。但是,当然,我想避免这种情况。
在类似Python的东西中,这种类型的词法范围解析是自动的。但是VimL很好。任何帮助或指示,将不胜感激。
答案 0 :(得分:2)
在类似Python的系统中,这种词法作用域解析是自动的
在VimScript中,除了lambdas,它是 manual 。您必须显式添加closure
关键字:
func! my_inner_func(cond) closure
...
endfunction
外部函数s:my_function的目的是生成一个函数,该函数将基于cond来执行适当的Ex命令(darg.a,darg.b或darg.c),而cond本身是由其他变量确定的
IMO,最好使用“部分”。
function! InnerFunc(foo, bar, baz)
...
endfunction
...
let OuterFunc = function('InnerFunc', ["FOO", "BAR"])
call OuterFunc("BAZ")