3

コードは次のとおりです。

(def entry {:name tempName :num tempNum})

(def tempList '(entry))

(println (get (nth tempList 0) (:name)))

Exception in thread "main" java.lang.IllegalArgumentException: Wrong number of args passed to keyword: :name

このコードでは、:name と :num を含む entry というマップを定義し、それをリストに入れ、リストの最初の (そして唯一の) 要素の :name フィールドを出力しようとします。(または、少なくともこれは私のコードが行うと思うことです:o)

リストに入れる前にエントリ マップから name にアクセスできますが、リストに入れるとこのエラーが発生します。どのような引数を与えるべきですか?

4

4 に答える 4

3

2つの問題があります。

まず、解決するシンボルを含むリスト(この場合のシンボルエントリなど)では、通常の引用符(アポストロフィ)の代わりに構文引用符(バックティック)を使用する必要があります。したがって、この行:

(def tempList '(entry))

する必要があります:

(def tempList `(entry))

または単に(Clojureでより慣用的で使いやすいベクトルを使用):

(def tempList [entry]) ; no quoting needed for vectors

次に、この行を変更します

(println (get (nth tempList 0) (:name)))

これのどちらかに:

(println (get (nth tempList 0) :name))

またはこれ:

(println (:name (nth tempList 0)))
于 2009-07-13T22:36:02.673 に答える
2

リストで使用nthすることは、要素を取得するために毎回線形検索を行う必要があるため、悪い考えです。ベクトルは、ここで使用する適切なコレクション タイプです。

ベクトルは、インデックスから値への「マップ」です。リストの代わりにベクトルを使用すると、次のことができます。

(:name (tempList 0))

または:

(get (get tempList 0) :name)

または:

(get-in tempList [0 :name]))
于 2009-07-13T23:14:49.553 に答える
1

私はあなたのコードを次のように書きます:

(def entry {:name tempName :num tempNum})

(def tempList (list entry))

(println (:name (first tempList)))

firstを使用するよりもはるかに優れていることに注意してくださいnth。キーワードは、マップ内で自分自身を検索する関数として機能します。別の同等のアプローチは、関数を作成してリストに適用することです。

((comp println :name first) tempList)
于 2009-07-21T02:07:12.057 に答える
1

3 行目の (:name) から ( ) を外します。:keywords は、マップを引数として取り、「自分自身を検索する」関数であり、非常に便利ですが、この場合、エラーが少し混乱します。

(get (nth '({:name "asdf"}) 0) :name))
于 2009-07-13T22:45:45.103 に答える