首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将局部变量传递给viml:-闭包在viml中创建的函数

将局部变量传递给viml:-闭包在viml中创建的函数
EN

Stack Overflow用户
提问于 2013-08-23 17:59:00
回答 1查看 628关注 0票数 4

我在运行时在一个execute/eval'd字符串中创建一个动态函数。这个函数是由调用生成器函数时存在的不同变量构建的。生成器函数如下,

代码语言:javascript
复制
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调用这个函数。

代码语言:javascript
复制
let callback = NewCallback('foo', { 'a': 1, 'b': 2 })
execute(":call " . callback . "(1, 2, 3)")

我遇到的问题是在生成的函数中访问NewCallback范围内的变量。在这里,我需要访问my_opts,它是NewCallback在生成的函数MyDynamicFunction_foo中本地的。

现在它给了我undefined variable my_ops

有没有办法在viml中做到这一点。定义可以访问父作用域的闭包函数?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-23 21:32:48

您可以在vimscript中使用类似于闭包的内容。他们被称为字典函数。这些是与字典相关联的函数,它们的作用类似于它们的隐式上下文。在这些函数中,隐式上下文可以通过关键字self访问。所以,它们就像对象方法。有关更好的解释,请参见这里

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

代码语言:javascript
复制
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)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18409014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档