Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop vimscript:使用字典函数中的call()调用[non-]字典函数_Oop_Vim - Fatal编程技术网

Oop vimscript:使用字典函数中的call()调用[non-]字典函数

Oop vimscript:使用字典函数中的call()调用[non-]字典函数,oop,vim,Oop,Vim,我希望使用call()调用一个“静态”字典函数。“static”是指函数的定义中没有使用关键字“dict”。我使用这个术语的目的是希望这个关键字的效果是在java/C++/etc中尽可能声明一个静态成员函数,即将函数名放在类名称空间中,但允许在不引用对象的情况下调用它 然而,这似乎不起作用。例如: " Setup: let testdict = { } funct! testdict.funct() echo "called" endfunct " Tests: " Followi

我希望使用call()调用一个“静态”字典函数。“static”是指函数的定义中没有使用关键字“dict”。我使用这个术语的目的是希望这个关键字的效果是在java/C++/etc中尽可能声明一个静态成员函数,即将函数名放在类名称空间中,但允许在不引用对象的情况下调用它

然而,这似乎不起作用。例如:

" Setup:
let testdict = { }
funct! testdict.funct() 
  echo "called" 
endfunct

" Tests:
"   Following each line is an indented comment
"     containing its output in message land, ie what was echoed.
call testdict.funct()
  " called
echo testdict.funct
  " 667
echo string(testdict.funct)
  " function('667')
echo function('667')
  " E475: Invalid argument: 667
echo function('testdict.funct')
  " testdict.funct
call call(testdict.funct, [ ])
  " E725: Calling dict function without Dictionary: 667

" Same deal if there's an intermediate variable involved.
let TestdictDotFunct = testdict.funct
echo TestdictDotFunct
  " 667
echo string(TestdictDotFunct)
  " function('667')
call TestdictDotFunct()
  " E725: Calling dict function without Dictionary: 667
从帮助主题E725:

也可以添加一个没有“dict”属性的函数 Funcref指向字典,但“self”变量当时不可用

因此,逻辑似乎表明,如果“self”不可用,那么应该可以在不使用字典的情况下调用Funcref引用的函数。然而,情况似乎并非如此。我错过什么了吗

Vim版本信息:

$ aptitude show vim-gnome
Package: vim-gnome
State: installed
Automatically installed: no
Version: 2:7.2.245-2ubuntu2

编辑

我真正想做的是允许字典函数透明地调用其他字典函数或非字典函数

这可以通过将self作为call()调用中的第三个参数来实现(谢谢@ZyX);如果正在调用非字典函数,则忽略此参数。我发现这有点令人惊讶,因为它与其他语言中的面向对象结构的工作方式非常不同。但是我猜VimScript的OOP东西在很多方面更像C,而不是C++。 乙二醇

因此,只要从dictionary函数中调用[non-]dictionary函数将
self
作为第三个参数传递给
call
,那么这将非常有效


这意味着,除了能够使用克隆和修改的字典(即复制原型)构建继承结构外,还可以将一些方法引用到非字典函数。

所有字典函数都需要提供一些字典作为
调用()的第三个参数。
。所有匿名函数都是字典函数。使用
函数dict.func()声明的所有函数都是匿名的。只需将
{}
作为所有
call()
调用的第三个参数,然后忘记这一点


并重新阅读文档。Self在您的函数中可用。文档说明,如果这样做,self将不可用:
let dict.func=function(“Foo”)

我错过了调用()的第三个参数;谢谢你。我想这可能是一个解决办法。澄清一下:我不希望
self
在函数中可用。我只想给一个匿名函数设置一个散列项的密钥。大多数情况下,我不想让名称空间中的函数名只是一个散列条目。文档(
:help E124
)中说,
添加[dict]参数时,必须通过| Dictionary |中的条目调用函数。局部变量“self”然后将设置为dictionary。
但是该参数似乎实际上没有任何作用,因为不传递dictionary就不可能调用这样的函数。哦,好的,我现在明白了
dict
被添加到不使用格式
dict.func
的函数中。但是,我想不可能使用
dict.func
表单声明一个可以在字典上下文之外调用的函数,也就是“匿名函数”。
let dict = { }
funct! dict.func(arg)
  echo 'dict.func called.'
  echo 'argument: '.a:arg
endfunct
funct! dict.callfunc_passself(arg)
  call call(self.func, [a:arg], self)
endfunct
funct! dict.callfunc_nopassself(arg)
  call call(self.func, [a:arg])
endfunct

funct! Func(arg)
  echo "Func called."
  echo 'argument: '.a:arg
endfunct


call dict.callfunc_passself('argument supplied to dict.callfunc')
  " dict.func called.
  " argument: argument supplied to dict.callfunc
call dict.callfunc_nopassself('argument supplied to dict.callfunc')
  " E725: Calling dict function without Dictionary: 37

let dict.func = function('Func')
call dict.callfunc_passself('argument supplied to dict.callfunc')
  " Func called.
  " argument: argument supplied to dict.callfunc
call dict.callfunc_nopassself('argument supplied to dict.callfunc')
  " Func called.
  " argument: argument supplied to dict.callfunc