2014-10-06 75 views
2

我有一個向量值,比如[210 50 60],我需要用它創建Java對象。比如我要創建Color申請Java構造函數

(Color. 210 50 60)   ; standard way 
(apply Color. [210 50 60]) ; hmm... I need something like this 

當然Color.的是不是一個功能,我們不能用就可以了apply。有沒有辦法解決這個任務的一種優雅的方式或做我必須把它寫這樣的:

(let [[r g b] [210 50 60]] 
    (Color. r g b)) 
+0

如何有一個3 int作爲參數的構造函數? – Marco 2014-10-06 08:55:32

+2

我認爲最接近的做法是製作一個lambda包裝:'(apply#(Color。%1%2%3)...)' – 2014-10-06 08:55:52

+0

@Marco,它不會比'let'更好。很顯然,這樣的包裝只是一種方式,以某種方式使用「應用」在先驗無用的環境中。我想,正確的解決方案就是某種標準宏。 – Mark 2014-10-06 08:59:55

回答

1

如果你不介意支付反射成本,我認爲https://stackoverflow.com/a/9172515/151650是一種優雅的方式。 如果你不介意瘋狂的宏:

(defn arity [c i] 
    (let [args (map #(symbol (str "arg" %)) (range i))] 
    `([[email protected]] (new ~c [email protected])))) 

(defmacro ->c [c] 
    (let [cs (.getConstructors (resolve c)) 
     arities (set (map #(count (.getParameterTypes %)) cs)) 
     fn-arities (map #(arity c %) arities)] 
    `(fn [email protected]))) 

(apply (->c java.awt.Color) 1 [2 3]) 
+0

謝謝,我不認爲這是可能的...雖然現在我更喜歡簡單的解決方案與'let'。 – Mark 2014-10-06 15:13:56