Java的交换机在Clojure中等效?

vik*_*hal 31 java language-features clojure

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

mik*_*era 39

案件是一个很好的选择,正如Jan所指出的那样

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

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

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

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

  • 很好的参考Discworld :) (2认同)

Jan*_*Jan 34

试试case宏:

(case (+ 2 3)
  6 "error"
  5 "ok")
Run Code Online (Sandbox Code Playgroud)

或者使用默认值

(case (+ 2 3)
  5 "ok"
  "error")
Run Code Online (Sandbox Code Playgroud)

请记住,根据文档

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

ClojureDocs上查看更多示例.

  • 如果您的测试值是非文字,您可能还需要查看`condp`:`(condp =(+ 2 3)(inc 4)"Ok"(dec 7)"error")`. (5认同)

omi*_*iel 7

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

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

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

  • 你不能使用case,这意味着你必须使用其他选项(condp带有值集?)来镜像它switch的行为.


[¹]在中不起作用,在实现功能方面起作用,起作用.