2016-11-20 7 views
1

Вот Clojure REPL сессия:Clojure: Почему я не могу ссылаться на методы класса, не вызывая их?

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). Почему?

ответ

3

Это не работает (в REPL или иначе), потому что нет статического поле называется parseDouble на Double класса. parseDouble - метод. Вы можете назвать это, но вы не можете получить к нему доступ, как поле.

+0

Интересно. Меня смущает тот факт, что я могу ссылаться (без вызова) функций Clojure, но не на Java. – Brendan

+0

Yep, функции Clojure и методы Java совершенно разные (с точки зрения реализации). IIRC, была рассмотрена возможность автоматического создания функции Clojure из статического метода, но в конечном итоге была отвергнута по прагматическим причинам. –

3

Если вы хотите превратить статический метод Java в функцию Clojure, что вы можете относиться как первый класс вещь, вы можете легко обернуть функцию вокруг него:

(def pd #(Double/parseDouble %)) 
#'user/pd 
(pd "1.0") 
1.0 

memfn функция может быть использована для сделайте что-нибудь подобное для методов экземпляра Java.