3

Otherのより複雑なバージョン (ラッピング) ですWhat。それは何をするかWhat、それ以上のことをします。2 つの名前空間を定義するように注意しました。

(ns what)

(defprotocol IWhatever
  (whatever [this]))

(deftype What []
  IWhatever
  (whatever [this]
            (str "whatever")))

(whatever (->What))

(ns other (:require what))

(deftype Other []
  what/IWhatever
  (whatever [this]
            (what/whatever (what/->What))))

(whatever (->Other)) ;bad line

エラーは次のとおりです。

clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to resolve symbol: whatever in this context, compiling:(C:\...)

この最後の式が解決されないのはなぜですか? 名前が見つからないようですが、ご覧のとおり、現在の名前空間で再定義しました。

これは無意味なコードですが、問題を説明するために最も単純な例を使用しました。関連する場合は、これを LightTable で実行しています。

4

1 に答える 1

3

プロトコルが定義された場所の名前空間で最後の行を修飾します。そこで定義されているので、名前空間でwhateverメソッドを呼び出そうと考え続けました。other

(what/whatever (->Other))

@soulcheck と、時間を割いて助けてくれたすべての人に感謝します。

于 2014-10-01T20:25:32.170 に答える