2016-10-26 9 views
1

Clojureの呼び出しメソッドをどのようにパラメータ化しますか?クロージャのJavaメソッドを引用符で囲まないでください

例:

(def url (java.net.URL. "http://www.google.com")) 
(.getHost url) ;; works! 
(def host '.getHost) 
(host url) ;; Nope :(
(~host url) ;; Nope :(
(eval `(~host url)) ;; Works :s 
+1

「.getHost」は「引用符付きのメソッド」ではないので、引用符を引用符で囲むことはできません。それは単なるシンボルです。また、あなたのシンボルをメソッド呼び出しに評価する方法をすでに検討しているようですが、何が問題なのですか? –

+0

最後の行が私を怖がってくれました!ハッピーハロウィン! –

答えて

0

あなたは、単に既存の関数のエイリアスを作成したい場合は、ラッパー関数は、あなたが必要とするすべてである:

> (ns clj (:import [java.net URL])) 
> (def url (URL. "http://www.google.com")) 
> (defn host [arg] (.getHost arg)) 
> (host url) 
;=> "www.google.com" 

で指摘したように、あなたがmemfnを使用することができますが別のユーザーは、何が起こっているのかがはっきりしないようです。確かに、でもclojure.orgは今それに対してお勧めします。


https://clojure.org/reference/java_interop

(memfn method-name arg-names)*

マクロ。 がオブジェクトと任意の引数を渡すことを期待するfnを作成するコードに展開し、 上の指定されたインスタンスメソッドを呼び出すと、オブジェクトはargsを渡します。ファーストクラスのfnとしてJavaメソッド を処理する場合に使用します。

(map (memfn charAt i) ["fred" "ethel" "lucy"] [1 2 3]) 
-> (\r \h \y) 

のような構文で、直接、今これを実行することがほとんど常に望ましい注:

(map #(.charAt %1 %2) ["fred" "ethel" "lucy"] [1 2 3]) 
-> (\r \h \y) 
-1

使用memfn

(def url (java.net.URL. "http://www.google.com")) 
(def host (memfn getHost)) 
(host url) 
+0

私は 'memfn'を忘れていました。 –

+0

memfnはClojure 1.0時代に控除されました。これは#(。methodname thing args args)の形式に置き換えられました –

+0

このArthurのソース? – ClojureMostly

0

パラメータ化する通常の方法Javaクラスのメソッドは次のとおりです。

#(.method fixed-object %) 

または

#(.method % fixed argument) 

またはオブジェクトまたは引数どちらも固定されている場合。

高次機能のラインマップ、フィルタ、および縮小でよく使用されます。

(map #(.getMoney %) customers) 
関連する問題