地图似乎是两者,我们可以同时做两件事
({:a 1} :a)
(因为它是一个IFn)和
(:a {:a 1})
因为它是一个ILookup。此外,RT / getFrom允许按键和IP地图按键和IPersistentSets按类似方式查找字符串和数组
ILookup给你的是什么,除了能够在其上使用关键词?为什么这比IFn好?
特别是,datomic.EntityMap
似乎是一个ILookup而不是一个IFn。
答案 0 :(得分:0)
clojure.lang.ILookup
适用于可以查找键(任意类型,不一定是关键字)的内容。 clojure.lang.IFn
用于可以称为函数的事物。仅根据这些使命陈述,不清楚它们之间是否有任何内在联系。
此外,ILookup
和IFn
的内容并不总是以同样的方式实现valAt
和invoke
:
(.valAt [0 1 2] 123)
;= nil
([0 1 2] 123)
;; throws IndexOutOfBoundsException
上述行为的原因是invoke
对向量的二进制nth
起作用,而valAt
的目的是实现get
的语义。
(关于
这些都不意味着invoke
比ILookup
“更好” - 它只是一个单独目的的单独界面。在他们之间引入IFn
关系需要出于某种原因,而且我不确定此时这样做会有很多好处。