2015-05-04 24 views
5

Życzę - if elseif else oświadczenie w NetLogo. Jak mogę to zrobić wydajnie? Sprawdziłem dokumentację NetLogo bez polecenia, aby to zrobić. Previous similar question nie odpowiedział bezpośrednio, ale rozwiązano go w kontekście.if elseif else implementacja w środowisku Netlogo

Prostym rozwiązaniem jest:

let flag true 
    if(condition1) 
    [ 
    ... 
    set flag false 
    ] 
    if(flag and condition2) ;else if statement 
    [ 
    ... 
    set flag false 
    ] 
    if(flag) ;else statement 
    [ 

    ... 
    ] 

szukam innych bardziej wydajnymi.

Edytuj: dodano flagę w drugim pod warunkiem na sugestię Mikołaja.

+2

Twój proponowany kod nie jest tak naprawdę 'if' /' elseif'/'else': co jeśli' warunek1' i 'warunek2' są oba' prawda'? Będziesz musiał zmienić swoje drugie 'if' na' if (flag i condition2) '. Ale to szybko staje się naprawdę nieprzyjemne. Dopóki nie pojawi się lepsze rozwiązanie (które może być wcześniej, niż myślisz ...), radziłbym trzymać się wzorca opisanego przez Setha w http://stackoverflow.com/a/20332555/487946. –

+0

Tak, nie wiem, jak to przegapiłem. Domyślam się, że podejście Setha jest tylko rozwiązaniem. Ale czyni to nieco mniej czytelnym, zwłaszcza gdy bloki zawierają więcej kodu. –

+0

Jesteśmy świadomi, że powinien istnieć lepszy sposób. Zobacz https://github.com/NetLogo/NetLogo/issues/344 –

Odpowiedz

4

Jedynym sposobem mogę całego serca polecam to:

ifelse condition1 
    [ ... ] 
    [ ifelse condition2 
     [ ... ] 
     [ ifelse condition3 
     [ ... ] 
     [ ifelse ... 

Ale tak, wcięcia i czytelność nie są wielkie. Aby zapoznać się z możliwymi ulepszeniami, zobacz https://github.com/NetLogo/NetLogo/issues/344 i https://github.com/qiemem/ControlFlowExtension.

+0

Dzięki! Czy to rozszerzenie działa również na okna? Choć może to wydawać się banalne pytanie, czy możesz wyjaśnić, jak z niego korzystać. Właśnie wkleiłem go w "folderze rozszerzeń w tej samej lokalizacji co aplikacja NetLogo". A następnie zaimportował go do modelu za pomocą rozszerzeń [ControlFlowExtension-master]. Ale to nie działa. –

+0

Proszę otworzyć nowe pytanie. –

+0

I nigdy nie mów "nie działa", zawsze mów dokładnie, co się stanie, łącznie z pełnym i dokładnym tekstem dowolnego komunikatu o błędzie. –

-1

znajdę tę formę najbardziej czytelny choć stosu „]” Na końcu jest trochę odpychający

ifelse item cur brain = 0 [sit][ 
ifelse item cur brain = 1 [eat][ 
ifelse item cur brain = 2 [steal][ 
ifelse item cur brain = 3 [birth][ 
ifelse item cur brain = 4 [hunger][ 
ifelse item cur brain = 5 [smell][ 
]]]]]] 

to ma tę zaletę, że zwięzły i czyta się jak „C” styl przełącznik oświadczenie