我有一些我通过这个命令调用的函数:
Function DoThisOrThat()
let mysubs="function1,function3"
exe 'call SUB_Dispatch("'.mysubs.'")'
do this or that
Endfunction
function! SUB_Dispatch(list_subs)
let mysubs = split(a:list_subs, ',')
if index(mysubs, "function1") != "-1"
exe 'call Sub_Function1()'
endif
if index(mysubs, "function2") != "-1"
exe 'call Sub_Function2()'
endif
if index(mysubs, "function3") != "-1"
exe 'call Sub_Function3()'
endif
etc..
endfunction
在Function1,2和3中有if / else语句,如:
If ....
do this
else
return
endif
如果调用Sub_Function1中的return
命令,它仍然会继续执行其他功能。
如果有return
?
答案 0 :(得分:3)
您可以为子功能指定返回值,如下所示:
if ...
do this
return 1
else
return 0
endif
然后,在SUB_Dispatch()
函数中,您可以对返回码进行测试,例如,替换以下内容:
if index(mysubs, "function1") != "-1"
exe 'call Sub_Function1()'
endif
由:
if index(mysubs, "function1") != -1
if Sub_Function1() == 0
return
endif
endif
或者,以更快的方式:
if index(mysubs, "function1") != -1 && !Sub_Function1()
return
endif
顺便说一下,在你的情况下添加exe
命令没用。您可以使用:
call SUB_Dispatch(mysubs)
而不是:
exe 'call SUB_Dispatch("'.mysubs.'")'
实际上,你也可以用更清洁的方式执行这类工作,例如:
function! DoThisOrThat()
let mysubs = ['Sub_Function1', 'Sub_Function2']
call SUB_Dispatch(mysubs)
endf
function! SUB_Dispatch(list_subs)
for f in a:list_subs
if !eval(f.'()')
return
endif
endfor
endf
答案 1 :(得分:2)
我应该在else中抛出异常并将try catch放在第一个函数中。我不熟悉你所说的语言,但我希望它会给你一些线索。