W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
毫無疑問,Vimscript函數(shù)可以接受參數(shù)。執(zhí)行下面的命令:
:function DisplayName(name)
: echom "Hello! My name is:"
: echom a:name
:endfunction
執(zhí)行下面的函數(shù):
:call DisplayName("Your Name")
Vim將顯示兩行:Hello! My name is:
?和?Your Name
。
注意我們傳遞給echom
命令的參數(shù)前面的a:
。這表示一個變量的作用域,在前幾章(譯注:第20章)我們曾講過。
讓我們試一下不帶作用域前綴會怎么樣。執(zhí)行下面的命令:
:function UnscopedDisplayName(name)
: echom "Hello! My name is:"
: echom name
:endfunction
:call UnscopedDisplayName("Your Name")
這次Vim抱怨說它找不到變量name
。
在寫需要參數(shù)的Vimscript函數(shù)的時候,你_總需要_給參數(shù)加上前綴a:
,來告訴Vim去參數(shù)作用域查找。
Vimscript函數(shù)可以設計為接受不定數(shù)目的參數(shù),就像Javascript和Python中的一樣。執(zhí)行下面命令:
:function Varg(...)
: echom a:0
: echom a:1
: echo a:000
:endfunction
:call Varg("a", "b")
這個函數(shù)向我們展示了許多東西,讓我們來逐一審視。
函數(shù)定義中的...
說明這個函數(shù)可以接受任意數(shù)目的參數(shù)。就像Python函數(shù)中的*args
函數(shù)中的第一行為輸出消息a:0
,結(jié)果顯示2
。當你在Vim中定義了一個接受可變參數(shù)的函數(shù),a:0
將被設置為你額外給的參數(shù)數(shù)量(譯注:注意是額外的參數(shù)數(shù)量)。 剛才我們傳遞了兩個參數(shù)給Varg
,所以Vim顯示2
。(譯注:2 - 0 ==# 2)
第二行為輸出a:1
,結(jié)果顯示a
。你可以使用a:1
,a:2
等等來引用你的函數(shù)接受的每一個額外參數(shù)。 如果我們用的是a:2
,Vim就會顯示"b"
第三行有些費解。當一個函數(shù)可以接受可變參數(shù),a:000
將被設置為一個包括所有傳遞過來的額外參數(shù)的列表(list)。 我們還沒有講過列表,所以不要太糾結(jié)于此。你不能對列表使用echom
,因而在這里用echo
代替。
你也可以將可變參數(shù)和普通參數(shù)一起用。執(zhí)行下面的命令:
:function Varg2(foo, ...)
: echom a:foo
: echom a:0
: echom a:1
: echo a:000
:endfunction
:call Varg2("a", "b", "c")
我們可以看到Vim將"a"
作為具名參數(shù)(named argument)a:foo
的值,將余下的塞進可變參數(shù)列表中。
試試執(zhí)行下面的命令:
:function Assign(foo)
: let a:foo = "Nope"
: echom a:foo
:endfunction
:call Assign("test")
Vim將拋出一個錯誤,因為你不能對參數(shù)變量重新賦值?,F(xiàn)在執(zhí)行下面的命令:
:function AssignGood(foo)
: let foo_tmp = a:foo
: let foo_tmp = "Yep"
: echom foo_tmp
:endfunction
:call AssignGood("test")
這次就可以了,Vim顯示Yep
。
閱讀:help function-argument
的前兩段。
閱讀:help local-variables
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: