Clojure REPL,互操作性,无法解析符号

3
假设files是Clojure中Java File的一个列表,我想获取文件名列表。在Leiningen REPL中,我可以使用以下命令:
(.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)

但我想知道是否有一种更优雅的方式将Java方法映射到Clojure中的列表。

1个回答

5
你可以使用memfn(有人说你不应该使用它,但我忘了为什么,请留言评论),或者简单地使用lambda:
(map (memfn getName) files)   ;;#1
(map #(.getName %) files)     ;;#2

为什么呢?因为这些是方法而不是函数。


2
在 Google 群组中进行了快速搜索,这里是 Rich Hickey 本人的话:'memfn 先于 #(),现在后者更受欢迎' - glts
@glts 谢谢,是的,我也在文档中找到了完全相同的语句,但我更想知道为什么它更受欢迎? - Shlomi
1
我现在将其读作#(),因为它已经成为一个不必要的便利。如果从一开始就有#()符号,那么memfn就不会被添加到核心中-所以它可能不是一个强烈的废弃。 - glts
不错,这正是我所想的。所以并不是说它是“错误”的,而只是多余的。 - Shlomi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接