2012-01-21 15 views
7

: कन्स्ट्रक्टर मैप और बाद में परिभाषित परिभाषाएं, मैं एक वैरगास कन्स्ट्रक्टर का प्रतिनिधित्व कैसे करूं (माना जाता है कि सुपरक्लास में कई कन्स्ट्रक्टर हैं जिनमें से एक varargs है)?क्लोजर जेन-क्लास वैरगास कन्स्ट्रक्टर

उत्तर

1

चूंकि वेरगास अनिवार्य रूप से ऑब्जेक्ट एरे के लिए सिंटैक्स चीनी हैं, तो आप केवल "[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)) 

और है कि यह कैसे आरईपीएल में लग रहा है

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

यह प्रश्न में बताई गई समस्या का समाधान नहीं करता है। एक vararg विधि को परिभाषित करने के बजाय यह विधि स्वीकार करने सरणी उत्पन्न करता है। यह वही नहीं है। अंतर यह है कि vararg जेनरेट बाइट कोड में विशेष ACC_VARARGS opscode द्वारा ध्वजांकित किया गया है जो क्लोजर इस समय समर्थन नहीं करता है। – Lambder

1

के बाद से 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;"] []} 
))