地图似乎两者兼备,我们可以两者兼得。
({:a 1} :a)(因为它是一个IFn)和
(:a {:a 1})因为它是一个ILookup。此外,RT/getFrom允许通过索引查找字符串和数组,通过键查找Java,成员以类似的方式查找IPersistentSets
除了在ILookup上使用关键字的能力之外,给了你什么?为什么这比IFn好?
特别是,datomic.EntityMap似乎是ILookup,而不是IFn。
发布于 2015-03-23 17:34:13
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“更好”--它只是一个单独的接口,有着不同的用途。在它们之间引入extends关系是有原因的,我不确定在这个时候这样做会有什么收获。
https://stackoverflow.com/questions/29199524
复制相似问题