【问题标题】:VimL/Vimscript: how to access local variable of outer function from its inner function?VimL/Vimscript:如何从内部函数访问外部函数的局部变量?
【发布时间】:2020-03-03 09:31:47
【问题描述】:

我有如下形式的函数:

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

外部函数 s:my_function 的目的是生成一个 Funcref,该函数将基于 cond 执行适当的 Ex 命令(darg.adarg.bdarg.c),它本身在其他地方由其他变量。

所以我的问题是我不知道如何从my_inner_func内部引用s:my_function范围内定义的局部变量darg当函数被调用时,我得到错误E121: Undefined variable: darg。如果我没有定义局部变量darg,它也不起作用(同样的错误),而只是尝试做execute a:dict_arg.b

我可以通过将darg 定义为全局来解决它,如let g:darg = copy(a:dict_arg),然后再定义execute g:darg.a。但当然,我想避免这种情况。

在 Python 之类的东西中,这种类型的词法范围解析是自动的。但是 VimL 很好.. VimL。任何帮助或指点将不胜感激。

【问题讨论】:

    标签: vim scope closures scoping


    【解决方案1】:

    在 Python 之类的东西中,这种类型的词法范围解析是自动的

    在 VimScript 中,除了 lambda,它是手动。您必须明确添加 closure 关键字:

    func! my_inner_func(cond) closure
        ...
    endfunction
    

    外部函数 s:my_function 的目的是生成一个 Funcref,它将根据 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 2017-03-08
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多