Chcę utworzyć funkcję z opcjonalnymi argumentami.
W Pythonie zrobiłbym coś takiego:
def functionName(arg1,arg2=false,arg3=false):
if arg2:
#Do stuff with arguments
else:
#Do stuff without arguments
Próbowałem to zrobić function FunctionName(arg1,arg2=false,arg3=false)
, ale po prostu wyświetla mi się błąd, mówiąc niepoprawny argument.
Jak mam to zrobić w vimscript?
let a:arg=
już więcej robić w vimie. Musisz użyć czegoś takiegolet l:arg=
lub po prostulet arg=
. Zobacz github.com/vim/vim/commit/…Ten wzorzec pozwoli ci przypisać znaczące nazwy do każdego argumentu i zapewni domyślną wartość dla wszystkich argumentów, które nie zostały podane:
Jak zauważył Boris Brodski:
condition ? result_if_true : result_if_false
to wyrażenie warunkowe (trójskładnikowe), które ocenia na drugi lub trzeci warunek w zależności od tego, czy pierwszy warunek był prawdziwy, czy nie.Więc jeśli nie zostanie podany trzeci argument,
baz
przyjmie wartość domyślną0
.Jednym z problemów z powyższym przykładzie jest to, że
a:foo
może jedynie być dostępne za:
prefiksem, a jednocześniebar
ibaz
może się obejść bez prefiksu. Ponieważ nie jest to bardzo spójne, możesz chcieć wyciągnąć wszystkie argumenty do zmiennych lokalnych, na przykład:(Technicznie rzecz biorąc, możesz użyć
l:
przedrostka, aby na przykład odwołać się do zmiennych lokalnych wewnątrz funkcjil:baz
, ale jest to zbędne, więc nie poleciłbym tego.)Ale zalecam korzystanie z tego formularza, gdy tylko jest to możliwe:
!
Pozwala przedefiniować swoją funkcję w czasie wykonywania (np przez przeładowywania scenariusz) orazs:
ogranicza zakres funkcji do skryptu. Pozwala to uniknąć zanieczyszczenia globalnej przestrzeni nazw (i ryzyka kolizji), jeśli do funkcji odwołuje się tylko z innego miejsca w skrypcie. Jest to ogólnie preferowany sposób definiowania funkcji, gdy nie muszą być one widoczne na całym świecie. ;-)źródło
a:0
nie zawiera ustalonych nazwanych parametrów.a:1
jest pierwszym parametrem w...
(Właśnie przetestowane z VIM 8.0)Nie znam się dobrze na vimscript, ale tak bym to zrobił:
Następnie możesz
call Func("Hello", "World")
zobaczyć, że wyświetla „Hello”, „World”, „Unspecified baz”.Wykorzystuje to funkcję varargs funkcji vim, która pozwala przekazać dowolną liczbę dodatkowych argumentów do funkcji. Argumenty są przechowywane w zmiennych, które w zależności od
a:0
(długości listy dodatkowych argumentów) są ustawiane na odpowiadający im argument lub na wartość domyślną.źródło
Od wersji Vim 8.1.1310 Vim obsługuje również rzeczywiste argumenty funkcji opcjonalnych.
Oznacza to jednak, że większość instalacji vima jeszcze tego nie obsługuje. Neovim również nie oferuje tej funkcji.
Przykład z
:help optional-function-argument
:źródło