Ich kann am besten beschreiben, wonach ich suche, indem ich Ihnen den fehlgeschlagenen Code zeige, den ich bisher ausprobiert habe:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
Ich habe ungefähr 4 oder 5 verschiedene when
Situationen, die durch ungefähr 50 verschiedene mögliche Werte von ausgelöst werden sollten car
. Gibt es eine Möglichkeit, dies mit case
Blöcken zu tun , oder sollte ich einen massiven if
Block versuchen ?
when "toyota", "lexus"
bekomme ich :unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
. Wenn ich dies jedoch schreibe:when "toyota","lexus"
funktioniert es. Der einzige Unterschied ist ein Leerzeichen nach dem Komma.or
oder||
hier nicht, weilwhen
rechts davon eine Reihe von durch Kommas getrennten Ausdrücken verwendet wird, keine einzelne Kennung. Aus diesem Grundwhen a or b
ist es nicht klar, ob dies als Äquivalent zuwhen a, b
oder zu verstehen istwhen (a or b)
, wobei letzterer den Ausdrucka or b
zuerst auswertet, bevor er in das Wann geworfen wird. Es ist überraschender und weniger einfach für die Sprache, Token zu haben, die das Verhalten basierend auf dem Kontext ändern, und dann könnten Sie keinen echtenor
Ausdruck auf der rechten Seite eines Wann verwenden.Sie können die "Splat" - oder Abflachungssyntax von Ruby nutzen.
Dies macht überwucherte
when
Klauseln - Sie müssen ungefähr 10 Werte pro Zweig testen, wenn ich das richtig verstehe - meiner Meinung nach etwas lesbarer. Darüber hinaus können Sie die zu testenden Werte zur Laufzeit ändern. Zum Beispiel:Ein anderer gängiger Ansatz wäre die Verwendung eines Hash als Versandtabelle mit Schlüsseln für jeden Wert von
car
und Werten, die ein aufrufbares Objekt sind, das den Code einschließt, den Sie ausführen möchten.quelle
when
Schlangen. Danke für das Teilen.Eine andere gute Möglichkeit, Ihre Logik in Daten einzufügen, ist etwa folgende:
quelle