将局部变量传递给在eval ie中创建的函数:viml中的闭包
我正在运行时在将局部变量传递给在eval ie中创建的函数:viml中的闭包,vim,Vim,我正在运行时在execute/eval'd字符串中创建一个动态函数。该函数由调用生成器函数时存在的不同变量生成。发电机功能如下: function! NewCallback(method, opts) let my_opts = a:opts let function_name = "g:MyDynamicFunction_" . a:method let body = "function! " . function_name . "(...)\n" let body .=
execute/eval
'd字符串中创建一个动态函数。该函数由调用生成器函数时存在的不同变量生成。发电机功能如下:
function! NewCallback(method, opts)
let my_opts = a:opts
let function_name = "g:MyDynamicFunction_" . a:method
let body = "function! " . function_name . "(...)\n"
let body .= " echo 'running " . function_name . "'\n"
let body .= " echo my_opts\n"
let body .= "endfunction"
execute body
return function_name
endfunction
我正在使用这个函数,如下所示。首先,我创建了一个回调函数,它给出了作为结果生成的函数的名称。然后我用:call调用这个函数
let callback = NewCallback('foo', { 'a': 1, 'b': 2 })
execute(":call " . callback . "(1, 2, 3)")
我遇到的问题是在生成的函数中访问NewCallback范围内的变量。在这里,我需要访问生成的函数MyDynamicFunction\u foo
中的myu opts
的本地NewCallback
目前它给我未定义的变量my_ops
在viml中是否有这样做的方法。ie:-定义可以访问父作用域的闭包函数
谢谢。您可以在vimscript中使用类似闭包的东西。它们被称为字典函数。这些函数与字典关联,就像它们的隐式上下文一样。在这些函数中,可以通过关键字
self
访问隐式上下文。所以,它们就像对象方法一样。请参阅以获得更好的解释
使用它们,您可以像这样对示例进行编码,例如:
function! NewListener(method, opts)
let context = {'name': a:method, 'opts': a:opts}
function! context.f(...)
echo "running " . self.name . "\n"
echo self.opts
echo "\n"
endfunction
return context
endfunction
let listener = NewListener('foo', { 'a': 1, 'b': 2 })
call listener.f(1, 2, 3)
好的,vimscript中没有闭包,但是没有任何东西阻止您将
my_opts
作为参数传递到MyDynamicFunction()
。回答得很好,谢谢您提供的链接,非常有用。