({:x 10, :y 20, :z 50} :y)
gives 20
以及
(:y {:x 10, :y 20, :z 50})
gives 20
在两种情况下,它如何在内部工作,
对于地图作为功能,我可以理解你可以通过理解第一个值是地图来区分表格。
但是如何成为一个功能?在运行时,key可以是任何类型的值,那么运行时如何理解它必须将此值视为函数?
答案 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
并且在类路径上的东西都可以被视为一个函数。