2017-04-19 37 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