2015-12-04 2 views
0

У меня есть несколько функций, которые я вызываю этой командой:Как выйти из цепочки функций?

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 .... 
    do this 
else 
    return 
endif 

return Если команда в Sub_Function1 является вызывается, он продолжает выполнять другие функции.

Есть ли команда, чтобы остановить выполнение vim всех команд, если есть return?

+1

Ваш код может выиграть от использования _Funcrefs_, а не для объединения идентификаторов с функциями через 'if..else ...' В целом, этот абстрактный пример выглядит чрезмерно сложным меня. –

ответ

2

Я должен исключить исключение в другом месте, где вы можете попытаться поймать первую функцию. Я не знаком с языком, который вы отметили, но я надеюсь, что он даст вам несколько результатов.

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 

или, в quickier образом:

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 
+0

Спасибо. Пробовал этот 'if index (mysubs," function1 ")! = -1 &&! Sub_Function1()' -> неизвестная функция Sub_Function1 – Reman

+0

Sub_Function1 - это имя примера, вы должны указать имя созданных вами функций. – yolenoyer

+1

Вместо ' eval', вы также имеете: 'if! call (f, [])'. Этот синтаксис становится интересным с вариационными функциями, так как мы можем передать 'a: 000' таким образом. –

Смежные вопросы