trong: constructors map và các định nghĩa sau -init, làm cách nào để biểu diễn một hàm tạo varargs (giả sử lớp cha có nhiều hàm tạo trong đó một là varargs)?clojure gen-class varargs constructor
7
A
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]
1
Kể từ clojure không hỗ trợ nó vào lúc này bạn cần phải vá nó với: https://groups.google.com/forum/#!topic/clojure/HMpMavh0WxA.
Và sử dụng thẻ meta mới:
(ns t.vtest
(:gen-class
:implements [clojure.lang.IDeref]
:init init
:state state
:constructors {^:varargs ["[Ljava.lang.Object;"] []}
))
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