为什么记录不是功能?

时间:2019-02-05 08:31:14

标签: clojure

与地图不同,记录不是函数。为什么?

;; 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

2 个答案:

答案 0 :(得分:5)

其他人已经回答了这个问题,但是这是您使一种defrecord类型实现IFn接口的方法:

{{1}}

答案 1 :(得分:2)

deftype and defrecord中,Rich写道“ defrecord提供了持久映射的完整实现... ”。那么记录应该作为功能发挥作用吗?

否。 IPersistentMap(用于持久映射的接口)未实现IFn(用于Clojure函数的接口)。

但是,一致性会很好:将地图转换为记录应该产生尽可能少的惊喜。话虽如此...

  • 我们仅在键是已知关键字的情况下使用记录,因此 关键字即函数语法一直可用。
  • 创建记录就像创建地图一样。这更大 我认为不一致。

我希望这种曲折的洗礼能有所帮助。