Java в Clojure, Вопрос оценки - PullRequest
       16

Java в Clojure, Вопрос оценки

3 голосов
/ 15 февраля 2010

Есть ли подробное объяснение результатов, полученных при оценке следующего в REPL.

(.PI Math)

дает

IllegalArgument Exception

пока

(. Math PI)

оценивается как

3.141592653589793

1 Ответ

12 голосов
/ 15 февраля 2010

Объяснение на http://clojure.org/java_interop.

user> (macroexpand '(.PI Math))
(. (clojure.core/identity Math) PI)

(identity Math) возвращает объект Class, представляющий класс Math. Вы пытаетесь получить доступ к члену экземпляра с именем PI в этом Class объекте, но он не существует. (Это отличается от доступа к статическому члену с именем PI в классе Math.) Этот объект Class можно использовать только для отражения или для передачи класса другим методам в качестве объекта или тому подобного вещей.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...