VimL / Vimscript:如何从内部函数访问外部函数的局部变量?

我具有以下形式的功能:

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参数的参数将是用abc键控的dict,它们各自的值是表示Ex命令的字符串。根据特定的cond(条件)执行。

外部函数s:my_function的目的是基于{{生成一个Funcref,该Funcref将执行适当的Ex命令(darg.adarg.bdarg.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很好。任何帮助或指示,将不胜感激。

gechenlei 回答:VimL / Vimscript:如何从内部函数访问外部函数的局部变量?

  

在类似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")
本文链接:https://www.f2er.com/3149165.html

大家都在问