1

Clojure では、マップとキーの両方をルックアップ関数として使用できるため、 ({:a 1 :b 2} :a)どちら(:a {:a 1 :b 2})も実行可能なルックアップ関数です。

それでは、複合キーのルックアップ関数としてマップを使用できるのに、その逆はできないのはなぜでしょうか?

これは({[:compound :mebaby] 1} [:compound :mebaby]})を返すことを意味します1([:compound :mebaby] {[:compound :mebaby] 1})、エラーをスローします。

4

3 に答える 3

2

キーワードIFnは、キーとして便利に使用できるようにする機能の 1 つとして実装されます。それらが実装する fn は、連想構造の引数での自分自身のルックアップです。これは、ベクトルのようなコレクションには当てはまりません。なぜなら、それらIFnは引数キーでそれ自体でルックアップを実行するために実装されているからです。

そのため、存在する({[:compound :mebaby] 1} [:compound :mebaby]})key の値をマップに問い合わせ[:compound :mebaby]ます。ただし([:compound :mebaby] {[:compound :mebaby] 1})、インデックスの値が何であるかをベクトルに尋ねます{[:compound :mebaby] 1}。これは整数ではないため、ベクトル内のインデックス/キーにすることはできず、エラーがスローされます。

于 2015-08-13T07:21:22.777 に答える