复合键作为clojure中的查找函数

时间:2015-08-13 07:04:14

标签: clojure lookup compound-key

在clojure中,您可以使用地图和键作为查找功能 ({:a 1 :b 2} :a)(:a {:a 1 :b 2})都是可行的查找功能。

为什么然后你可以使用map作为复合键的查找函数而不是相反?

这意味着({[:compound :mebaby] 1} [:compound :mebaby]})将返回1,但([:compound :mebaby] {[:compound :mebaby] 1})会抛出错误。

3 个答案:

答案 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]不是关键字,而是一个向量。向量不能用作查找函数。