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