Clojure: Почему я не могу ссылаться на методы класса, не вызывая их?
Вот сессия 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
, но я не могу напрямую ссылаться на это. Я вижу тот же результат для других методов класса в стандартной библиотеке Java (например, Math/abs
, Integer/parseInt
). почему это?
2 ответа
Решение
Это не работает (в REPL или иным образом), потому что нет статического поля с именем parseDouble
на Double
учебный класс. parseDouble
это метод. Вы можете назвать это, но вы не можете получить к нему доступ как поле.
Если вы хотите превратить статический Java-метод в функцию Clojure, которую вы можете рассматривать как первоклассную вещь, вы можете легко обернуть вокруг нее функцию:
(def pd #(Double/parseDouble %))
#'user/pd
(pd "1.0")
1.0
memfn
Функция может использоваться, чтобы сделать что-то подобное для методов экземпляра Java.