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

问题描述 投票:0回答:1

我具有以下形式的功能:

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,它们的值是表示将根据特定cond执行的Ex命令的字符串。 (条件)。

外部函数s:my_function的目的是生成一个Funcref,它将基于darg.a执行适当的Ex命令(darg.bdarg.ccond),该命令本身由其他人确定。变量。

所以我的问题是,我不知道如何从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很好。任何帮助或指示,将不胜感激。

vim scope closures scoping
1个回答
0
投票

在类似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
© www.soinside.com 2019 - 2024. All rights reserved.