Clojure Gen-класс конструктор Varargs - PullRequest
8 голосов
/ 21 января 2012

в карте: constructors и последующих определениях -init, как мне представить конструктор varargs (при условии, что суперкласс имеет несколько конструкторов, один из которых varargs)?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Поскольку 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))

, и вот как это выглядит в REPL

user=> @(t.vtest. (into-array Object ["A" "B" 1 2]))
first element of args A total elements 4
["A" "B" 1 2]
1 голос
/ 11 сентября 2013

Так как clojure не поддерживает его в данный момент, вам необходимо исправить это с помощью: 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;"] []} 
  ))
...