Answers:
是的,您可以在函数中使用可选参数。它不如python那样方便,但这是您的方法:
function FooBar(...) " This is like *args in python
echom a:0 " a:0 contains an integer which is the number of arguments passed to the function
echom a:1 " a:1 contains the first argument passed, a:2 contains the second and so on
echo a:000 " a:000 contains a list of all arguments that were passed to the function
endfunction
请注意,以这种方式最多只能有20个参数。
相关帮助主题:
:help :function
:help function-argument
晚了一点,但是我没有看到我最喜欢的人:
function! FunctionName(arg1,...)
let arg2 = get(a:, 1, 0)
let arg3 = get(a:, 2, 0)
if arg2
"Do stuff with arguments"
else
"Do stuff without arguments"
endif
endfunction
其中get(a:, n, default)
将得到nth
可选参数返回default
,如果它不存在。
let a:arg=
在vim中做任何事情。您必须使用let l:arg=
或之类的东西let arg=
。见github.com/vim/vim/commit/...
通过此模式,您可以为每个参数分配有意义的名称,并为未提供的所有参数提供默认值:
function FunctionName(foo, ...)
let bar = a:0 >= 1 ? a:1 : 0
let baz = a:0 >= 2 ? a:2 : 0
...
" Code that makes use of a:foo, bar and baz
鲍里斯·布罗德斯基(Boris Brodski)指出:
a:0
计算传递的可选参数的数量
a:1
,,a:2
...让我们访问可选参数强制参数(仅
foo
在上面的示例中)不计算在内
condition ? result_if_true : result_if_false
是条件(三元)表达式,其值取决于第二项或第三项是否为真。
因此,如果未提供第三个参数,baz
则将采用默认值0
。
与上面的例子中的一个问题是,a:foo
可以只与被访问的a:
前缀,而bar
并baz
没有前缀可以做。由于这不是很一致,因此您可能更喜欢将所有参数都拉到局部变量中,如下所示:
function FunctionName(...)
let foo = a:1 " Will throw an error if no arg was provided
let bar = a:0 >= 2 ? a:2 : 0
let baz = a:0 >= 3 ? a:3 : 0
...
" Code that makes use of foo, bar and baz
(从技术上讲,您可以使用l:
前缀来引用函数内部的局部变量,例如l:baz
,但这是多余的,因此我不建议这样做。)
但是我建议您尽可能使用以下表格:
function! s:FunctionName(...)
将!
(通过重新加载脚本如)允许您在运行时重新定义函数和s:
功能上的限制脚本范围。如果仅从脚本内的其他位置引用您的函数,则可以避免污染全局名称空间(并且有发生冲突的危险)。通常,当不需要全局可见的函数时,这是定义函数的首选方法。;-)
a:0
不包含固定的命名参数。a:1
是第一个参数...
(刚刚通过VIM 8.0测试)
我不太精通Vimscript,但这是我要这样做的方式:
function Func(foo, ...)
if a:0 < 1
let bar = "Unspecified bar"
else
let bar = a:1
endif
if a:0 < 2
let baz = "Unspecified baz"
else
let baz = a:2
endif
echo a:foo
echo bar
echo baz
endfunction
然后call Func("Hello", "World")
,您可以看到它显示“ Hello”,“ World”,“ Unspecified baz”。
这是使用vim函数的varargs功能,它使您可以向函数传递任意数量的额外参数。参数存储在变量中,该变量取决于a:0
(附加参数列表的长度)被设置为其相应的参数或默认值。
从Vim 8.1.1310开始, Vim还支持真正的可选函数参数。
但是,这意味着大多数vim安装尚不支持此功能。另外,neovim也没有提供该功能。
来自的示例:help optional-function-argument
:
function Something(key, value = 10)
echo a:key .. ": " .. a:value
endfunction
call Something('empty') "empty: 10"
call Something('key', 20) "key: 20"