deftype failding lein repl私は何を間違っていますか?
-
25-10-2019 - |
質問
あたり 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.
. 。例:こちらを参照してください:
- http://pastebin.com/9vqppebt
- http://onclojure.com/2010/08/26/reusable-method-implementations-for-deftypes/ (使用します
(new foo ...)
それ以外の(foo. ...)
)
このスレッドは、これが変化であったことを示しているようです 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つに別のレコードが含まれていることを決定した場合にも簡単にネストできます。