在 Clojure 中应用关键字映射与映射到关键字

cus*_*der 1 clojure

说我有一张地图{:x 1}

我注意到我可以:x通过将其应用于地图来查找:

(:x {:x 1})
;=> 1
Run Code Online (Sandbox Code Playgroud)

或者通过将映射应用于关键字:

({:x 1} :x)
;=> 1
Run Code Online (Sandbox Code Playgroud)

这两种形式有什么区别?

cfr*_*ick 5

映射和关键字都实现IFn并因此可以用作函数。他们实现的功能是get. 所以它基本上总是转化为(get map key default).

因此,您可以自行制定一些经验法则;需要考虑的一些事项:

  • 如果您在地图中有关键字,那么使用关键字是您在代码库中最常见的事情
  • 如果您的键不是关键字或没有函数(例如字符串),您通常最好将地图应用为函数(例如({"a" 1} "a")
  • 每当您不确定您拥有的一件事(键或地图)是否为零时,您最好使用确定不为空的东西(否则您会收到异常)(例如(nil {:a 1})失败,但({:a 1} nil)有效) ; 如果您对两者都不确定:使用get