2017-04-19 58 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方法來列出一個更優雅的方式。

回答

4

您既可以使用memfn(其中有人說你不應該使用,不記得爲什麼,歡迎評論),或只是一個拉姆達:

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

至於爲什麼好,因爲這些方法,而不是功能。

+2

從Rich Hickey自己快速搜索Google小組,並且在這裏:['memfn在#()之前,後者現在是首選的]](https://groups.google.com/d/ MSG/Clojure的/ XX-zt7LYzUI/kUQDg1DDNOsJ)。 – glts

+0

@glts謝謝,是的,我還發現,在文檔中完全相同的聲明,但我更期待*爲什麼*它是首選? – Shlomi

+0

我現在把它看作'memfn',簡直成了不必要的便利。如果'#()'符號從一開始就存在,'memfn'不會被添加到核心 - 所以它可能不是一個強烈的棄用。 – glts