作为地图功能的密钥如何在Clojure中以相同的方式工作?

时间:2013-09-10 10:14:02

标签: clojure

({:x 10, :y 20, :z 50} :y)
gives 20

以及

(:y {:x 10, :y 20, :z 50})
gives 20

在两种情况下,它如何在内部工作,

对于地图作为功能,我可以理解你可以通过理解第一个值是地图来区分表格。

但是如何成为一个功能?在运行时,key可以是任何类型的值,那么运行时如何理解它必须将此值视为函数?

1 个答案:

答案 0 :(得分:4)

地图是来自docs

的功能
  

Maps实现IFn,用于一个参数(一个键)的invoke(),带有可选的第二个参数(默认值),即maps是其键的函数。零键和值都可以。

所以这个:

({:x 10, :y 20, :z 50} :y)

将函数{:x 10, :y 20, :z 50}应用于:y

关键字也是函数,引用docs

  

关键字为一个参数(一个映射)的invoke()实现IFn,并带有可选的第二个参数(默认值)。例如(:mykey my-hash-map:none)表示与(get my-hash-map:mykey:none)相同

所以当你这样做时:

(:y {:x 10, :y 20, :z 50})

您实际上以:y作为参数调用{:x 10, :y 20, :z 50}

基本上任何实现IFn并且在类路径上的东西都可以被视为一个函数。