在 clojure 中,您可以同时使用映射和键作为查找函数,因此
({:a 1 :b 2} :a)
它们(:a {:a 1 :b 2})
都是可行的查找函数。
那么为什么你可以使用地图作为复合键的查找函数,而不是相反呢?
这意味着({[:compound :mebaby] 1} [:compound :mebaby]})
将返回1
,但([:compound :mebaby] {[:compound :mebaby] 1})
会抛出错误。
在 clojure 中,您可以同时使用映射和键作为查找函数,因此
({:a 1 :b 2} :a)
它们(:a {:a 1 :b 2})
都是可行的查找函数。
那么为什么你可以使用地图作为复合键的查找函数,而不是相反呢?
这意味着({[:compound :mebaby] 1} [:compound :mebaby]})
将返回1
,但([:compound :mebaby] {[:compound :mebaby] 1})
会抛出错误。
关键字IFn
作为其功能之一实现,以使其方便用作键。他们实现的 fn 是在关联结构参数中查找自己。对于像您的向量这样的集合而言,情况并非如此,因为它们实现IFn
了在参数键处自行查找。
所以({[:compound :mebaby] 1} [:compound :mebaby]})
询问地图 key 的值是什么[:compound :mebaby]
,它存在。但是([:compound :mebaby] {[:compound :mebaby] 1})
询问向量索引处的值{[:compound :mebaby] 1}
是什么。这不是整数,因此它不能是向量中的索引/键并引发错误。
您可以使用键作为查找函数的假设是不正确的。您可以使用关键字作为查找功能。在您的示例:a
中是关键字。因此它可以用作查找功能。但是[:compound :mebaby]
不是关键字,那是向量。向量不能用作查找函数。
原因是:您的复合键不再是关键字。它现在是一个向量,虽然仍然是一个IFn
,但它只接受整数,比如i
,作为参数,返回i
向量的第 th 个元素。
我怀疑您真正想要的是从嵌套映射中提取值,例如从{:a {:b "c"}}
. 如果是这样,这两种形式是等价的:
(get-in {:a {:b "c"}} [:a :b])
;=> "c"
((comp :b :a) {:a {:b "c"}})
;=> "c"