Java的交换机在Clojure中等效?

时间:2011-12-02 06:09:03

标签: java clojure language-features

Clojure中是否有Java的switch构造的等价物?如果是,那是什么?如果不是,我们是否必须使用if else阶梯来实现它?

3 个答案:

答案 0 :(得分:39)

如{Jan>指出的那样,

case是一个不错的选择

cond在许多相关情况下也非常有用,特别是如果你想在评估一系列不同条件表达式的基础上进行切换,例如

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

请注意,cond的结果由第一个匹配的表达式决定,因此负余额将显示“Overdrawn!”即使它也符合低平衡案例。

[我编辑了代码 - 删除了末尾的额外括号以使其正常工作]

答案 1 :(得分:34)

尝试case宏:

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

或使用默认值

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

请记住,根据文档

  

不评估测试常数。它们必须是编译时的文字,不需要引用。 (...)

请参阅ClojureDocs上的更多示例。

答案 2 :(得分:7)

虽然@Jan和@mikera建议使用casecond(我可以在列表中添加condp吗?)从功能¹角度来看是合理的,尽管case的限制(例如测试值只能是编译时常量;默认返回值是必需的)与switch的那些相反,存在一些细微差别:

  • case不能与Java Enum常量一起使用;

  • case的调度基于散列AFAIK,使其在性能方面与哈希映射相当; switch更快;

  • 您无法使用case,这意味着您必须使用其他选项(condp和值集?)来反映switch的行为。


[¹]在中不起作用,在履行功能方面起作用,达到目的。