2012-01-21 8 views
7

:コンストラクタマップと後続の定義では、どのようにしてvarargsコンストラクタを表現できますか?(スーパークラスには複数のコンストラクタがvarargsであると仮定します)clojure gen-class varargsコンストラクタ

答えて

1

varargsは基本的にオブジェクト配列のシンタックスシュガーであるため、 "[Ljava.lang.Object;"コンストラクタのパラメータの型として指定します。ここで

は、いくつかのサンプルコードです:

(ns t.vtest 
    (:gen-class 
    :implements [clojure.lang.IDeref] 
    :init init 
    :state state 
    :constructors {["[Ljava.lang.Object;"] []})) 
    ;;          ^----------------------- 
    ;; You should put "[Ljava.lang.Object;" for superclass varargs constructor here 
    ;; I left it blank for the sake of working example 

(defn -init 
    [args] 
    (println "first element of args" (aget args 0) "total elements" (alength args)) 
    [[] (into [] args)]) 

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

とそれはそれはClojureのは、現時点ではそれをサポートしていないので

user=> @(t.vtest. (into-array Object ["A" "B" 1 2])) 
first element of args A total elements 4 
["A" "B" 1 2] 
+0

問題の問題は解決しません。 varargメソッドを定義するのではなく、arrayを受け付けるメソッドを生成します。これは同じではありません。違いは、varargには生成されたバイトコード内の特別なACC_VARARGS opscodeによってフラグが立てられ、現在はサポートされていません。 – Lambder

1

は、あなたがそれにパッチを適用する必要がREPLでどのように見えるかです:https://groups.google.com/forum/#!topic/clojure/HMpMavh0WxA.

新しいメタタグで使用してください:

(ns t.vtest 
    (:gen-class 
    :implements [clojure.lang.IDeref] 
    :init init 
    :state state 
    :constructors {^:varargs ["[Ljava.lang.Object;"] []} 
))