Existe-t-il une explication détaillée des résultats obtenus en évaluant ce qui suit sur REPL.Java dans Clojure, question d'évaluation
(.PI Math)
donne
IllegalArgument Exception
tout
(. Math PI)
est évaluée à
3.141592653589793
Existe-t-il une explication détaillée des résultats obtenus en évaluant ce qui suit sur REPL.Java dans Clojure, question d'évaluation
(.PI Math)
donne
IllegalArgument Exception
tout
(. Math PI)
est évaluée à
3.141592653589793
L'explication est à http://clojure.org/java_interop.
user> (macroexpand '(.PI Math))
(. (clojure.core/identity Math) PI)
(identity Math)
retourne l'objet Class
représentant la classe Math
. Vous essayez d'accéder à un membre d'instance appelé PI
dans cet objet Class
, mais il n'existe pas. (Ceci est différent de l'accès à un membre statique appelé PI
dans la classe Math
.) Vous utiliseriez seulement cet objet Class
pour la réflexion, ou pour passer une classe autour d'autres méthodes comme un objet, ou ce genre de choses.
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
Le moyen le plus court de faire ce que vous voulez est probablement Math/PI
.
user> (macroexpand '(Math/PI))
(. Math PI)
user> Math/PI
3.141592653589793
user> (. Math PI)
3.141592653589793