与地图不同,记录不是函数。为什么?
;; maps are functions of the keys
({:a 1} :a) ;; 1
({:a 1}) ;; error
({:a 1} 1) ;; nil
;; records? no, records are not functions
(defrecord T [t])
((->T 1) :t) ;; error: T cannot be cast to clojure.lang.IFn
(:t (->T 1)) ;; 1
答案 0 :(得分:5)
其他人已经回答了这个问题,但是这是您使一种defrecord类型实现IFn接口的方法:
{{1}}
答案 1 :(得分:2)
在deftype
and defrecord
中,Rich写道“ defrecord提供了持久映射的完整实现... ”。那么记录应该作为功能发挥作用吗?
否。 IPersistentMap
(用于持久映射的接口)未实现IFn
(用于Clojure函数的接口)。
但是,一致性会很好:将地图转换为记录应该产生尽可能少的惊喜。话虽如此...
我希望这种曲折的洗礼能有所帮助。