【问题标题】:Clojure REPL, interop, Unable to resolve symbolClojure REPL,互操作,无法解析符号
【发布时间】:2017-04-19 08:30:17
【问题描述】:

假设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 中的列表。

【问题讨论】:

    标签: java clojure clojure-java-interop


    【解决方案1】:

    你可以使用memfn(有人说你不应该使用,不记得为什么,欢迎 cmets)或者只是一个 lambda:

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

    至于为什么,因为这些是方法而不是函数。

    【讨论】:

    • 快速搜索了 Google 组,这里是 Rich Hickey 本人:‘memfn preceded #(), the latter now being preferred’
    • @glts 谢谢,是的,我还在文档中发现了完全相同的陈述,但是我正在寻找更多为什么它是首选?
    • 我把它读作memfn 现在只是变得不必要的方便。如果 #() 符号从一开始就存在,memfn 就不会被添加到核心 - 所以它可能不是一个强烈的弃用。
    • 很好,我就是这么想的。所以这并不是说它“错误”,它只是多余的。
    猜你喜欢
    • 1970-01-01
    • 2012-07-15
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2015-01-13
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多