Clojure中是否有Java的switch
构造的等价物?如果是,那是什么?如果不是,我们是否必须使用if
else
阶梯来实现它?
答案 0 :(得分:39)
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建议使用case
或cond
(我可以在列表中添加condp
吗?)从功能¹角度来看是合理的,尽管case
的限制(例如测试值只能是编译时常量;默认返回值是必需的)与switch
的那些相反,存在一些细微差别:
case
不能与Java Enum
常量一起使用;
case
的调度基于散列AFAIK,使其在性能方面与哈希映射相当; switch
更快;
您无法使用case
,这意味着您必须使用其他选项(condp
和值集?)来反映switch
的行为。
[¹]在functional-programming中不起作用,在履行功能方面起作用,达到目的。