Java';s开关在Clojure中的等效值?
Clojure中Java的Java';s开关在Clojure中的等效值?,java,clojure,language-features,functional-programming,Java,Clojure,Language Features,Functional Programming,Clojure中Java的开关构造是否有等价物?如果是,是什么?如果没有,我们是否必须使用If
开关
构造是否有等价物?如果是,是什么?如果没有,我们是否必须使用If
案例
宏:
(case (+ 2 3)
6 "error"
5 "ok")
或使用默认值
(case (+ 2 3)
5 "ok"
"error")
请记住,根据文档
不评估测试常数。它们必须是编译时文本,不需要引用。(……)
如Jan所指出的,是一个很好的选择
在许多相关情况下也非常有用,特别是如果您希望在计算一系列不同条件表达式的基础上进行切换,例如
(defn account-message [balance]
(cond
(< balance 0) "Overdrawn!"
(< balance 100) "Low balance"
(> balance 1000000) "Rich as creosote"
:else "Good balance"))
(defn帐户消息[余额]
(续)
(<余额0)“透支!”
(<余额100)“低余额”
(>余额1000000)“富含杂酚油”
:否则为“良好平衡”)
请注意,cond的结果由第一个匹配表达式确定,因此负余额将显示“Overdrawn!”,即使它也匹配低余额情况
[我已经编辑了代码-删除了结尾处的额外括号以使其正常工作]尽管@Jan和@mikera使用或(我可以添加到列表中吗?)的建议从功能的角度来看是合理的,尽管
case
的限制(例如,测试值只能是编译时间常数;默认返回值是必需的)与开关类似,存在一些细微差别:
case
不能与JavaEnum
常量一起使用
case
的分派是基于hashing AFAIK的,这使得它在性能上与hashmaps相当<代码>开关
快得多
case
,这意味着您必须使用其他选项(condp
带值集?)来镜像开关的行为
[1]没有中的功能,功能就像实现一个功能,为一个目的服务。如果您的测试值是非文本的,您可能还想查看
condp
:(condp=(+23)(inc 4)“Ok”(dec 7)“error”)
@Jan使用clojure的case
会减慢过程(值得注意的时间),还有其他选择吗?@vikbehal,正如米凯拉在回答中指出的那样,还有cond
。我真的很想知道这次经济放缓的原因是什么。你能做一些研究,例如分析,并分享结果吗?很好地参考了Discworld:)注意,cond
将返回nil
,如果不满足任何条件!