2014-04-26 22 views
8

Zauważyłem, że REBOL nie ma wbudowanego w if...elsif...else składni, jak ten:If ... else if ... else w REBOL

theVar: 60 

{This won't work} 
if theVar > 60 [ 
    print "Greater than 60!" 
] 
elsif theVar == 3 [ 
    print "It's 3!" 
] 
elsif theVar < 3 [ 
    print "It's less than 3!" 
] 
else [ 
    print "It's something else!" 
] 

Znalazłem obejście, ale to bardzo gadatliwy:

theVar: 60 

either theVar > 60 [ 
    print "Greater than 60!" 
][ 
     either theVar == 3 [ 
      print "It's 3!" 
     ][ 
      either theVar < 3 [ 
       print "It's less than 3!" 
      ][ 
       print "It's something else!" 
      ] 
     ] 
] 

Czy jest bardziej zwięzły sposób wdrożyć łańcuch w REBOL if...else if...else?

Odpowiedz

8

Konstrukt, którego szukasz, to CASE. Aby ocenić, wykonuje szereg warunków i bloków kodu, oceniając bloki tylko wtedy, gdy warunek jest spełniony i zatrzymuje się po spełnieniu pierwszego warunku prawdziwego.

theVar: 60 

case [ 
    theVar > 60 [ 
     print "Greater than 60!" 
    ] 

    theVar == 3 [ 
     print "It's 3!" 
    ] 

    theVar < 3 [ 
     print "It's less than 3!" 
    ] 

    true [ 
     print "It's something else!" 
    ] 
] 

Jak widać, uzyskanie wartości domyślnej jest tak proste, jak sczepianie w stanie TRUE.

Także: jeśli chcesz, możesz mieć wszystkie przypadki uruchomione, a nie zwarcie z CASE/ALL. To zapobiega zatrzymywaniu się przypadku w pierwszym prawdziwym stanie; uruchomi je wszystkie kolejno, oceniając dowolne bloki pod względem prawdziwych warunków.

2

Można użyć konstrukcji case dla tego lub konstruktu przełącznika.

case [ 
    condition1 [ .. ] 
    condition2 [ ... ] 
    true [ catches everything , and is optional ] 
] 

Konstrukcja przypadku jest używana w przypadku testowania dla różnych warunków. Jeśli szukasz przy określonej wartości, można użyć przełączyć

switch val [ 
    va1 [ .. ] 
    val2 [ .. ] 
    val3 val4 [ either or matching ] 
] 
7

I Kolejną opcją jest użycie wszystkich

all [ 
    expression1 
    expression2 
    expression3 
] 

i tak długo, jak każde wyrażenie zwraca wartość true, będą one nadal do oceny.

tak,

if all [ .. ][ 
... do this if all of the above evaluate to true. 
... even if not all true, we got some work done :) 
] 

i mamy też żadnych

if any [ 
     expression1 
     expression2 
     expression3 
][ this evaluates if any of the expressions is true ]