我想做一个带有可选参数的函数。

在python中我会做这样的事情:

def functionName(arg1,arg2=false,arg3=false):
    if arg2:
        #Do stuff with arguments
    else:
        #Do stuff without arguments


我尝试做function FunctionName(arg1,arg2=false,arg3=false) ,但这只会给我一个错误提示,指出参数无效。

我该如何在vimscript中执行此操作?

#1 楼

是的,您可以在函数中使用可选参数。它不像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


#2 楼

参加聚会有点晚了,但是我没有看到我最喜欢的一个: br />

评论


哦,太好了!

– joeytwiddle
17年9月6日在1:57

我知道这太老了,但仅供任何读者阅读。您不能再在vim中设置a:arg =。您必须使用let l:arg =之类的东西,或者只是让arg =。见github.com/vim/vim/commit/…

– jmzagorski
19年2月21日在18:37

哪里有文件记录?与a:000相同吗?

–user202729
20-4-8在6:46



@ user202729检出:help内部变量,有一点解释,像“ a:”或“ s:”这样的范围可以用作字典。它与a:000不太一样,因为它是一个列表,因此它是零索引的,您将需要使用get(a :, n-1,default)代替,但是除此之外,您可以毫无问题地使用它。

– phicr
20-4-10的3:39

#3 楼

通过这种模式,您可以为每个参数分配有意义的名称,并为未提供的任何参数提供默认值:

br />

a:0计算传递的可选参数的数量

a:1a:2,...让我们访问可选参数

强制性参数(在上面的示例中仅foo)不计算在内。

因此,如果未提供第三个参数,则condition ? result_if_true : result_if_false将采用默认值baz

与上述示例有关的一个问题是,只能使用以下命令访问0 a:foo前缀,而a:bar可以不带前缀。由于这不是很一致,因此您可能希望将所有参数都拉出局部变量,如下所示:

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


(从技术上讲,您可以使用baz前缀来引用函数内部的局部变量,例如l:,但这是多余的,所以我不建议这样做。) br />
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:baz允许您在运行时重新定义函数(例如,通过重新加载脚本),而!则将函数限制为脚本作用域。如果仅从脚本内的其他位置引用您的函数,则可以避免污染全局名称空间(并且有发生冲突的危险)。通常,在不需要全局可见的功能时,这是定义功能的首选方法。 ;-)

评论


a:0不包含固定的命名参数。 a:1是...中的第一个参数(仅在VIM 8.0中进行了测试)

– Boris Brodski
18年4月30日在11:54

谢谢@BorisBrodski,您说得对,很好。我已经纠正了答案。

– joeytwiddle
18年5月1日在14:44

#4 楼

我不太熟悉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”,“世界”,“未指定的baz”。

这是使用vim函数的varargs功能,它使您可以将任意数量的额外参数传递给该函数。这些参数存储在变量中,这些变量取决于a:0(额外参数列表的长度)而被设置为相应的参数或默认值。

#5 楼

由于Vim 8.1.1310还支持真正的可选函数参数。

但是,这意味着大多数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"   


评论


整齐。您应该扩展您的答案以举一个例子,以便我们可以快速理解它所添加的内容。

–卢克·赫米特(Luc Hermitte)
19年11月21日在10:53

@LucHermitte我相应地修改了答案。

– radlan
19年11月22日在8:52