Clojure:为什么我不能在不调用的情况下引用 class 方法?
Clojure: Why can't I reference class methods without calling them?
这是一个 Clojure REPL 会话:
moon.core> Double
java.lang.Double
moon.core> (Double/parseDouble "1.0")
1.0
moon.core> Double/parseDouble
CompilerException java.lang.RuntimeException: Unable to find static field: parseDouble in class java.lang.Double, compiling:(*cider-repl moon*:1:7159)
我可以引用Double
,我可以调用 Double/parseDouble
,但我不能直接 ]reference吧。我在 Java 标准库(例如 Math/abs
、Integer/parseInt
)中看到其他 class 方法的结果相同。为什么会这样?
这不起作用(在 REPL 或其他方式中),因为 Double
[=17] 上没有名为 parseDouble
的静态 字段 =]. parseDouble
是一种方法。可以调用,但是不能像字段一样访问。
如果你想把一个静态 Java 方法变成一个 Clojure 函数,你可以把它当作第一个 class 东西,你可以很容易地围绕它包装一个函数:
(def pd #(Double/parseDouble %))
#'user/pd
(pd "1.0")
1.0
memfn
函数可用于为 Java 实例方法做类似的事情。
这是一个 Clojure REPL 会话:
moon.core> Double
java.lang.Double
moon.core> (Double/parseDouble "1.0")
1.0
moon.core> Double/parseDouble
CompilerException java.lang.RuntimeException: Unable to find static field: parseDouble in class java.lang.Double, compiling:(*cider-repl moon*:1:7159)
我可以引用Double
,我可以调用 Double/parseDouble
,但我不能直接 ]reference吧。我在 Java 标准库(例如 Math/abs
、Integer/parseInt
)中看到其他 class 方法的结果相同。为什么会这样?
这不起作用(在 REPL 或其他方式中),因为 Double
[=17] 上没有名为 parseDouble
的静态 字段 =]. parseDouble
是一种方法。可以调用,但是不能像字段一样访问。
如果你想把一个静态 Java 方法变成一个 Clojure 函数,你可以把它当作第一个 class 东西,你可以很容易地围绕它包装一个函数:
(def pd #(Double/parseDouble %))
#'user/pd
(pd "1.0")
1.0
memfn
函数可用于为 Java 实例方法做类似的事情。