【问题标题】:Clojure and JavaFX 2 -- passing multiple-arity arguments to JavaFX methodsClojure 和 JavaFX 2——将多参数参数传递给 JavaFX 方法
【发布时间】:2013-05-29 11:52:41
【问题描述】:

很多JavaFx方法都带var args,比如Group,在Java中声明为:

public Group(Node... children)

其他例如:

public KeyFrame(Duration time, KeyValue... values)

我发现 ... 意味着我应该将一个 java 数组传递给该方法,所以我一直在做这样的事情,

(-> timeline .getKeyFrames 
  (.addAll 
    (into-array [(KeyFrame. blabla) (KeyFrame. blabla)]))`

每次有 var arg 时都必须做(into-array...) 很烦人,当 var arg 是我实际传入的基类时更烦人。例如

(Group. (into-array [(Circle. 100) (Rectangle. 100 100)]))

导致类型不匹配错误。相反,我必须这样做:

(Group. (into-array Node [(Circle. 100) (Rectangle. 100 100)]))

所以我做了这个功能:

(defn make-group [& items]
  (Group. (into-array Node items)))

这对组很好,但不能解决一般问题。

那么有没有一种解决省略号/可变参数问题的好方法,这样我就不必为每个可变参数方法创建特殊函数了?这个函数的要求是它需要你想要调用的方法(例如Group)、固定的参数、var args,并且不知何故,函数会神奇地知道在 var 中找到元素的公共基类参数。

谢谢

【问题讨论】:

    标签: java clojure javafx-2 variadic-functions clojure-java-interop


    【解决方案1】:

    您是否尝试过将参数放入向量中?我没有尝试过您提到的所有用例,但是例如在使用 addAll() 方法时,我只是将参数放入文字向量中,例如

        (.addAll (.getChildren btn-pane) [new-puzzle-pane check-box hint-btn
                                      check-btn solve-btn load-btn save-btn
                                      print-btn about-btn spacer])
    

    【讨论】:

    • 直接传递向量是我首先尝试并得到Wrong number of args (0) passed to: PersistentVector
    【解决方案2】:

    我最终使用了一个宏,我有点怀疑我需要它:

    (defmacro jvar [method & args]
      (let [lastargs (last args)
            evaled-lastargs (eval lastargs)]
        (if (coll? evaled-lastargs)
          (let [firstargs (butlast args)
                klass (eval (last firstargs))
                supset (map #(supers (class %)) evaled-lastargs)
                common (apply intersection #{klass} supset)]
            (if (seq common)
              `(~method ~@(butlast firstargs) (into-array ~(first common) ~lastargs))
              `(~method ~@firstargs (into-array ~lastargs)))))))
    

    这样的用法:

    (jvar Group. Node [(Circle. 100) (Rectangle. 10 10)])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      相关资源
      最近更新 更多