Vim 脚本问题:在一个函数中如何将不定参数 (...) 传给别的支持不定参数的函数?

Vim、Emacs配置和使用
回复
wz520
帖子: 36
注册时间: 2010-09-23 13:47

Vim 脚本问题:在一个函数中如何将不定参数 (...) 传给别的支持不定参数的函数?

#1

帖子 wz520 » 2014-04-14 18:12

代码: 全选

func s:A(a, ...)
	if a:a == 1
		call s:B(...)
	else
		" do another thing ...
	endif
endfunc

func s:B(...)
	" dosomething ...
endfunc

s:A(1, 2, 3, 4, 5)
call s:B(...) 这一行报错说 “无效的表达式 ...)"
不知道在 Vim 脚本里如何传 ... 到别的函数?
头像
zhw2101024
帖子: 1849
注册时间: 2009-03-28 16:10
系统: Arch debian win7
联系:

Re: Vim 脚本问题:在一个函数中如何将不定参数 (...) 传给别的支持不定参数的函数?

#2

帖子 zhw2101024 » 2014-04-14 20:20

可以给出不超过 20 个参数,以逗号分隔。最后,可以给出参数 "...",意味着可以有更
多的参数。在函数里,可以通过 "a:1"、"a:2" 等等访问它们。"a:0" 设为这些附加参数
的数目 (可以为 0)。"a:000" 设为包含这些参数的 |List|。注意 "a:1" 等同于
"a:000[0]"。

这是在vim里输入

代码: 全选

help function
看到的。楼主折腾函数都不用看帮助的吗?
wz520
帖子: 36
注册时间: 2010-09-23 13:47

Re: Vim 脚本问题:在一个函数中如何将不定参数 (...) 传给别的支持不定参数的函数?

#3

帖子 wz520 » 2014-04-15 18:08

感谢楼上的回答,但是……

a:000 是个 List ,貌似没法扩展成实参列表,单个 List 参数和多个参数是不同的。

当然因为最多 20 个参数,所以我可以

代码: 全选

call s:B(a:1, a:2, a:3 ... a:20) " 这里 ... 代表 a:4 ~ a:19,不想写了……
但如果这些 a: 变量有哪个不存在,就会报错。

当然解决办法也不是完全没有,我只想到:

代码: 全选

if a:0 == 20
	call s:B(a:1, a:2, a:3 ..., a:20)
else if a:0 == 19
	call s:B(a:1, a:2, a:3 ..., a:19)
else if a:0 == 18
	...
但这明显太蛋疼了……

Python 里要实现起来就很简单,而且也很常见于各种官方库和第三方库:

代码: 全选

class Child(Base)
	def __init__(self, *args, **kwargs)
		super(Base, self).__init__(*args, **kwargs)
Lua 里更简单,直接 ...

代码: 全选

function fA(...)
	fB(...)
end
Vim 脚本里……不直接支持?
头像
astolia
论坛版主
帖子: 6539
注册时间: 2008-09-18 13:11

Re: Vim 脚本问题:在一个函数中如何将不定参数 (...) 传给别的支持不定参数的函数?

#4

帖子 astolia » 2014-10-27 0:28

vim把list作为参数展开的方法是call()

代码: 全选

func A(...)
    call call("B", a:000)
endfunc

func B(...)
    echo a:000
endfunc
回复