Najlepszym sposobem, w jaki mogę opisać to, czego szukam, jest pokazanie nieudanego kodu, którego do tej pory próbowałem:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
Mam około 4 lub 5 różnych when
sytuacji, które powinny być wywołane przez około 50 różnych możliwych wartości car
. Czy można to zrobić za pomocą case
bloków, czy powinienem wypróbować masywny if
blok?
ruby-on-rails
ruby
syntax
switch-statement
Nacięcie
źródło
źródło
when "toyota", "lexus"
otrzymuję:unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
. Kiedy jednak to piszę:when "toyota","lexus"
działa. Jedyną różnicą jest spacja po przecinku.or
lub||
tutaj, ponieważwhen
bierze po prawej stronie serię wyrażeń oddzielonych przecinkami, a nie pojedynczy identyfikator. Z tego powodu, jeśli takwhen a or b
, nie jest jasne, czy należy to traktować jako ekwiwalentwhen a, b
lubwhen (a or b)
, przy czym ten ostatni ocenia wyrażeniea or b
najpierw przed wrzuceniem go do kiedy. Bardziej zaskakujące i trudniejsze w obsłudze jest to, że język ma tokeny, które zmieniają zachowanie w zależności od kontekstu, a wtedy nie byłoby możliwe użycie prawdziwegoor
wyrażenia po prawej stronie kiedy.Możesz skorzystać z „ikony” Ruby lub składni spłaszczania.
To sprawia, że przerośnięte
when
klauzule - masz około 10 wartości do przetestowania na gałąź, jeśli dobrze rozumiem - są trochę bardziej czytelne. Ponadto można zmodyfikować wartości do testowania w czasie wykonywania. Na przykład:Innym powszechnym podejściem byłoby użycie skrótu jako tabeli wysyłania, z kluczami dla każdej wartości
car
i wartościami, które są niektórymi obiektami wywołującymi kodowanie kodu, który chcesz wykonać.źródło
when
linii. Dzięki za udostępnienie.Innym dobrym sposobem na umieszczenie logiki w danych jest coś takiego:
źródło