gpt4 book ai didi

vim - 将局部变量传递给在 eval 中创建的函数,即 :- Closures in viml

转载 作者:行者123 更新时间:2023-12-01 11:42:25 24 4
gpt4 key购买 nike

我正在运行时在 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 范围内的变量。这里我需要访问 my_opts这是 NewCallback 的本地在生成的函数中 MyDynamicFunction_foo .

目前它给了我 undefined variable my_ops

Is there a way to do this in viml. ie:- Defining closure functions that can access parent scope?



谢谢。

最佳答案

你可以在 vimscript 中有类似闭包的东西。它们被称为字典函数。这些是与字典相关联的函数,就像它们的隐式上下文。在这些函数中,可以通过关键字 self 访问隐式上下文。 .所以,它们就像对象方法。见 here为了更好的解释。

使用它们,您可以像这样编写示例代码,例如:

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)

关于vim - 将局部变量传递给在 eval 中创建的函数,即 :- Closures in viml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18409014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com