首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ILookup的目的是什么,为什么它不扩展IFn?

ILookup的目的是什么,为什么它不扩展IFn?
EN

Stack Overflow用户
提问于 2015-03-22 20:34:05
回答 1查看 727关注 0票数 3

地图似乎两者兼备,我们可以两者兼得。

代码语言:javascript
复制
({:a 1} :a)

(因为它是一个IFn)和

代码语言:javascript
复制
(:a {:a 1})

因为它是一个ILookup。此外,RT/getFrom允许通过索引查找字符串和数组,通过键查找Java,成员以类似的方式查找IPersistentSets

除了在ILookup上使用关键字的能力之外,给了你什么?为什么这比IFn好?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-23 17:34:13

clojure.lang.ILookup用于查找键(任意类型,不一定是关键字)。clojure.lang.IFn是指可以称为函数的东西。仅仅基于这些任务声明,还不清楚它们之间是否有任何内在的联系。

此外,ILookupIFn的东西并不总是以相同的方式实现valAtinvoke

代码语言:javascript
复制
(.valAt [0 1 2] 123)
;= nil

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

造成上述行为的原因是,invoke的工作方式类似于向量上的二进制nth,而valAt的目的是实现get的语义。

(关于向量上的invoke应该做什么,可能存在意见分歧,但这是一个单独的讨论。)

所有这些都不意味着ILookupIFn“更好”--它只是一个单独的接口,有着不同的用途。在它们之间引入extends关系是有原因的,我不确定在这个时候这样做会有什么收获。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29199524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档