質問

あたり http://www.assembla.com/spaces/clojure/wiki/datatypes

以下をレインの返信に入力できるはずです。

(deftype bar [abcde])

(def b(バー1 2 3 4 5))

ただし、次の出力を取得します。

java.lang.exception:varを期待するが、barはclass users.bar(no_source_file:31)にマッピングされます。

私は混乱していて、すべての助けを得るための完全なNewbです!

注:Standard Clojure REPLで同じコードを試して、同じ問題を取得しました。

回答:まあ、私は少し追加の検索で自分の質問に答えました。サンプルが悪かったことがわかりました。バーをインスタンス化する正しい方法は次のとおりです。

(def b(bar。12 3 4 5))

。その使用法のバーの終わりには重要です。それでも理由がよくわからない(そのため、詳細を知りたいので時間があれば、専門家が詳しく説明してください;))。

みんな、ありがとう!

役に立ちましたか?

解決

私はそれほど馴染みがありません deftype, 、しかし、私が見ているものから、あなたはタイプをインスタンス化するポイントが必要です、これを試してください:

(deftype Bar [a b c d e])

(def b (Bar. 1 2 3 4 5))

そうではないことに注意してください Bar, 、 しかし Bar.. 。例:こちらを参照してください:

このスレッドは、これが変化であったことを示しているようです deftype:

または、それを逆に言うために、あなたがリンクするページ上のドキュメントは時代遅れに見えるように見えます。

お役に立てれば。

他のヒント

あなたがやろうとしていることを達成する方法は2つあります。まず、行きましょう deftype 例。

user=> (deftype Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 2 3 4 5))
#'user/b
user=> (:a b)
nil
user=> (.a b)
1

ここでいくつかのことに気付くでしょう。言及したように、「」が必要です。あなたのタイプをインスタンス化するために。さらに、キーワードアクセス( ":" notation)を取得せず、フィールドアクセスのみ(繰り返し、 "。")。

他の方法は、記録を定義することです defrecord:

user=> (defrecord Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 3 5 7 9))
#'user/b
user=> (:a b)
1
user=> (.a b)
1

これにより、フィールドとキーワードの両方のアクセスが可能になります。このアクセスは、フィールドの1つに別のレコードが含まれていることを決定した場合にも簡単にネストできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top