什么是ILookup以及它为什么不扩展IFn?

时间:2015-03-22 20:34:05

标签: clojure

地图似乎是两者,我们可以同时做两件事

({:a 1} :a)

(因为它是一个IFn)和

(:a {:a 1})

因为它是一个ILookup。此外,RT / getFrom允许按键和IP地图按键和IPersistentSets按类似方式查找字符串和数组

ILookup给你的是什么,除了能够在其上使用关键词?为什么这比IFn好?

特别是,datomic.EntityMap似乎是一个ILookup而不是一个IFn。

1 个答案:

答案 0 :(得分:0)

clojure.lang.ILookup适用于可以查找键(任意类型,不一定是关键字)的内容。 clojure.lang.IFn用于可以称为函数的事物。仅根据这些使命陈述,不清楚它们之间是否有任何内在联系。

此外,ILookupIFn的内容并不总是以同样的方式实现valAtinvoke

(.valAt [0 1 2] 123)
;= nil

([0 1 2] 123)
;; throws IndexOutOfBoundsException

上述行为的原因是invoke对向量的二进制nth起作用,而valAt的目的是实现get的语义。

(关于

这些都不意味着invokeILookup“更好” - 它只是一个单独目的的单独界面。在他们之间引入IFn关系需要出于某种原因,而且我不确定此时这样做会有很多好处。