3

lein がコードを再コンパイルする方法は予測できないようです。あるディレクトリに gen-class ファイルがあり、別のディレクトリにアクセスしようとしています。たとえば、次の gen-class があるとします。

(ns a.Target
    (:gen-class
     :state state
     :init  init
     :constructors {[String String] []}))

(defn -init
  [m1  m2]
  [[]  (atom {"A" m1 "B" m2})])

(defn -deref
  [this]
  @(.state this))

そして、別の名前空間からこれにアクセスしようとすると、1、2、3 のランダムなバリエーションを試すことになります。

(ns b.runner
    (:require [a.Target  ] :as Target) ;1
    (:import '(a Target))              ;2
)

(compile 'a.Target) ;3

「a.Target」の代わりに「Target」を認識する構文がないように思われるため、gen-class への対処方法に明らかに誤りがあります。これは問題です。注釈付きのプロバイダー メソッドを使用して guice-injector にアクセスしようとしているのですが、注釈の構文が完全なクラス仕様または単純なクラス仕様のいずれも受け入れていないようです。

(definterface TargetProvider (^a.Target getTarget [this] ))
=> Exception in thread "main" java.lang.UnsupportedOperationException: nth not supported on this type:

または簡略化されたもの:

(definterface TargetProvider (^Target getTarget [this] ))
=> Can't find class java.lang.Target
4

1 に答える 1

3

ns 式は、クラスをインポートするため(ns b (:import a.Target))に使用する必要がないはずです。:requireはマクロであるため、およびその他のオプションns内のすべての記号は評価されないため、それらを引用する必要はありません。次の宣言を使用すると、式が機能するはずです。:require:usensdefinterface

(ns b
  (:import a.Target))

(definterface TargetProvider [^a.Target getTarget []])

(->> b.TargetProvider .getMethods seq)
;= (#<Method public abstract a.Target b.TargetProvider.getTarget()>)

編集

これは、上で定義したインターフェイスを使用するプロキシのコードです。これはTargetProvider、コメントで求めていたものだと思います。

インターフェイスのgetTargetメソッドの宣言も変更し、引数を削除したことに注意してくださいthis。これは、実際には現在のインスタンスの参照を受け取っていないためです。使用する場合proxy、暗黙的にバインドされたthisローカルがあります (詳細については、こちらを参照してください)。

(let [x (proxy [TargetProvider] []
          (getTarget [] (Target. "x" "y")))]
  (.getTarget x))
于 2014-01-27T20:03:04.327 に答える