为了处理我们稍后可以调用的Java实例方法,我们可以调用memfn函数:
user=> (def g (memfn Integer/toString))
#'user/g
user=> (g 789)
"789"
Run Code Online (Sandbox Code Playgroud)
这对Java静态方法不起作用:
user=> (def g (memfn Integer/toHexString))
#'user/g
user=> (g 789)
IllegalArgumentException No matching method found: toHexString for class java.lang.Long clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:52)
user=> (g)
ArityException Wrong number of args (0) passed to: user$g clojure.lang.AFn.throwArity (AFn.java:437)
Run Code Online (Sandbox Code Playgroud)
我们如何获得Java静态方法的句柄,以便稍后调用它?
(defn g [x] (Integer/toHexString x))
...?如果你愿意,你可以将它包装在一个宏中,但是没有什么可做的:
(defmacro static-fn [f] `(fn [x#] (~f x#)))
(def g (static-fn Integer/toHexString))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
452 次 |
最近记录: |