2012-01-21 8 views

Trả lời

1

Vì varargs chủ yếu là đường cú pháp cho mảng Đối tượng, bạn chỉ có thể sử dụng "[Ljava.lang.Object;" như kiểu tham số của hàm tạo.

Dưới đây là một số mẫu mã:

(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)) 

và đó là cách có vẻ trong REPL

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

Nó không giải quyết được vấn đề được nêu trong câu hỏi. Thay vì định nghĩa một phương thức vararg nó tạo ra phương thức chấp nhận mảng. Điều này là không giống nhau. Sự khác biệt là vararg được gắn cờ bởi mã OP_VARARGS đặc biệt trong mã byte được tạo ra mà clojure không hỗ trợ tại thời điểm này. – Lambder