({:x 10, :y 20, :z 50} :y)
gives 20
并且
(:y {:x 10, :y 20, :z 50})
gives 20
在这两种情况下它是如何在内部工作的,
对于作为函数的地图,我可以理解您可以通过了解第一个值是地图来区分形式。
但是 key 是如何变成函数的呢?在运行时,键可以是任何类型的值,那么运行时如何理解它必须将此值视为函数?
({:x 10, :y 20, :z 50} :y)
gives 20
并且
(:y {:x 10, :y 20, :z 50})
gives 20
在这两种情况下它是如何在内部工作的,
对于作为函数的地图,我可以理解您可以通过了解第一个值是地图来区分形式。
但是 key 是如何变成函数的呢?在运行时,键可以是任何类型的值,那么运行时如何理解它必须将此值视为函数?
地图是函数,来自文档:
映射实现 IFn,用于一个参数(键)的调用()和可选的第二个参数(默认值),即映射是其键的函数。nil 键和值都可以。
所以这:
({:x 10, :y 20, :z 50} :y)
将函数{:x 10, :y 20, :z 50}
应用于:y
.
关键字也是函数,引用文档:
关键字使用可选的第二个参数(默认值)为一个参数(映射)的 invoke() 实现 IFn。例如 (:mykey my-hash-map :none) 的含义与 (get my-hash-map :mykey :none) 相同
所以当你这样做时:
(:y {:x 10, :y 20, :z 50})
你实际上调用:y
with{:x 10, :y 20, :z 50}
作为参数。
基本上任何实现IFn
并在类路径上的东西都可以被视为一个函数。