2017-04-19 10 views
2

filesはClojureのJavas Fileのリストで、ファイル名のリストを取得したいとします。私が使用することができますLeiningenをREPLでは、Clojure REPL、interop、シンボルを解決できません

(.getName (nth files 4)) 
=> "image.jpg" 

、と言うが、私は

(map .getName files) 

を使用する場合REPLはCompilerException java.lang.RuntimeException: Unable to resolve symbol: .getName in this contextをスローします。何故ですか?

私は

(defn gn [file] (.getName file)) 
(map gn files) 

でこの問題を回避することができますが、Clojureの中リストへのJavaメソッドをマッピングするために、よりエレガントな方法がある場合、私は今したいと思います。これらの方法ではなく機能しているだけでなくので、なぜ、用として

(map (memfn getName) files) ;;#1 
(map #(.getName %) files)  ;;#2 

答えて

4

あなたは、単にラムダを(一部は歓迎、なぜコメントを覚えて、あなたは使うべきではないと言ういけないもの)memfnを使用するか、または可能性のいずれか。

+2

Googleグループのクイック検索がありました。Rich Hickey自身から:['memfn preceded#()、後者が優先されました'](https://groups.google.com/d/ msg/clojure/Xx-zt7LYzUI/kUQDg1DDNOsJ)。 – glts

+0

@gltsありがとうございます、はい、私はまた、ドキュメント内にまったく同じステートメントを見つけましたが、私はそれが好まれている理由をもっと探していましたか? – Shlomi

+0

私は 'memfn'としてこれを読んでいます。 '#()'表記が最初からあった場合、 'memfn'はcoreに追加されませんでしたので、強く非難されるかもしれません。 – glts

関連する問題