3
對REPL評估以下結果是否有詳細的解釋。Clojure中的Java,評估問題
(.PI Math)
給
IllegalArgument Exception
而
(. Math PI)
評估爲
3.141592653589793
對REPL評估以下結果是否有詳細的解釋。Clojure中的Java,評估問題
(.PI Math)
給
IllegalArgument Exception
而
(. Math PI)
評估爲
3.141592653589793
說明從http://clojure.org/java_interop。
user> (macroexpand '(.PI Math))
(. (clojure.core/identity Math) PI)
(identity Math)
返回表示Math
類Class
對象。您嘗試訪問此Class
對象中名爲PI
的實例成員,但它不存在。 (這與在Math
類中訪問一個名爲PI
的靜態成員不同)。您只會使用此對象進行反射,或者將Class作爲Object傳遞給其他方法或其他類型的東西。
user> (class (identity Math))
java.lang.Class
user> (.getName (identity Math))
"java.lang.Math"
user> (.getName Math)
"java.lang.Math"
user> (.getMethods Math)
#<Method[] [Ljava.lang.reflect.Method;@12344e8>
user> (vec (.getMethods Math))
[#<Method public static int java.lang.Math.abs(int)> #<Method public static long java.lang.Math.abs(long)> #<Method public static float java.lang.Math.abs(float)> ...]
user> (.getField Math "PI")
#<Field public static final double java.lang.Math.PI>
user> (.getDouble (.getField Math "PI") Math)
3.141592653589793
做你想做的事情的最短路線可能是Math/PI
。
user> (macroexpand '(Math/PI))
(. Math PI)
user> Math/PI
3.141592653589793
user> (. Math PI)
3.141592653589793