Эквивалент переключателя Java в Clojure? - PullRequest
31 голосов
/ 02 декабря 2011

Есть ли эквивалент в Java switch конструкции в Clojure? Если да, что это? Если нет, нужно ли использовать if else лестницу для достижения этой цели?

Ответы [ 3 ]

39 голосов
/ 02 декабря 2011

case - хороший вариант, как указано Jan

cond , также очень полезен во многих связанных с этим обстоятельствах, особенно если вы хотите переключиться на базуоценки диапазона различных условных выражений, например,

(defn account-message [balance]
  (cond 
    (< balance 0) "Overdrawn!"
    (< balance 100) "Low balance"
    (> balance 1000000) "Rich as creosote"
    :else "Good balance"))

Обратите внимание, что результат cond определяется первым соответствующим выражением, поэтому в отрицательном балансе будет отображаться «Overdrawn!»хотя он также соответствует регистру низкого баланса.

[Я отредактировал код - убрал лишнюю скобку в конце, чтобы она заработала]

34 голосов
/ 02 декабря 2011

Попробуйте макрос case:

(case (+ 2 3)
  6 "error"
  5 "ok")

или со значением по умолчанию

(case (+ 2 3)
  5 "ok"
  "error")

Помните, что согласно документации

Тест -константы не оцениваются.Они должны быть литералами времени компиляции и не должны заключаться в кавычки.(...)

См. Дополнительные примеры на ClojureDocs .

7 голосов
/ 02 декабря 2013

Хотя предложения @Jan и @mikera по использованию case или cond (могу ли я добавить condp в список?) звук с функциональной точки зрения и, хотя ограничения case (например, тестовые значения могут быть только константами времени компиляции; возвращаемое значение по умолчанию обязательно) отражают значения switch, есть некоторые тонкие различия:

  • case нельзя использовать с константами Java Enum;

  • case основана на хешировании AFAIK, что делает его сопоставимым с хэш-картами с точки зрения производительности; switch намного быстрее;

  • вы не можете перейти с помощью case, что означает, что вы должны использовать другие опции (condp с наборами значений?) Для отражения поведения switch.


[¹] не функционирует, как в , функционирует, как при выполнении функции, служащей цели.

...