2016-11-20 3 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/absInteger/parseInt)と同じ結果が表示されます。それはなぜですか?

答えて

3

DoubleクラスにparseDoubleと呼ばれる静的なフィールドが存在しないので、これは、(REPLにまたはそれ以外)は動作しません。 parseDoubleが方法です。それを呼び出すことはできますが、フィールドのようにアクセスすることはできません。

+0

興味深い。私はClojure関数を参照することはできますが、Javaメソッドを参照することはできません。 – Brendan

+0

さて、Clojure関数とJavaメソッドは完全に異なっています(実装の観点から)。 IIRCでは、静的メソッドから自動的にClojure関数を生成する機能が考慮されましたが、実際には拒否されました。 –

3

あなたはファーストクラスのものとして扱うことができClojureの関数に、静的なJavaメソッドをオンにする場合、あなたは簡単に周りの機能をラップすることができます:

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

memfn機能をするために使用することができますJavaインスタンスメソッドの場合は、このようなことをします。

関連する問題