【问题标题】:Clojure: Why can't I reference class methods without calling them?Clojure:为什么我不能在不调用类方法的情况下引用它们?
【发布时间】:2016-11-20 19:02:15
【问题描述】:

这是一个 Clojure REPL 会话:

moon.core> Double
java.lang.Double
moon.core> (Double/parseDouble "1.0")
1.0
moon.core> Double/parseDouble
CompilerException java.lang.RuntimeException: Unable to find static field: parseDouble in class java.lang.Double, compiling:(*cider-repl moon*:1:7159) 

我可以引用Double,我可以调用Double/parseDouble,但我不能直接引用它。对于 Java 标准库中的其他类方法(例如 Math/absInteger/parseInt),我看到了相同的结果。为什么会这样?

【问题讨论】:

    标签: clojure jvm lisp clojure-repl


    【解决方案1】:

    如果您想将静态 Java 方法转换为 Clojure 函数,您可以将其视为一流的东西,您可以轻松地将函数包装在它周围:

    (def pd #(Double/parseDouble %))
    #'user/pd
    (pd "1.0")
    1.0
    

    memfn 函数可用于对 Java 实例方法执行类似的操作。

    【讨论】:

      【解决方案2】:

      这不起作用(在 REPL 或其他方式中),因为在 Double 类上没有名为 parseDouble 的静态 字段parseDouble 是一种方法。您可以调用它,但不能像访问字段一样访问它。

      【讨论】:

      • 有趣。我对我可以引用(不调用)Clojure 函数但不能引用 Java 方法这一事实感到困惑。
      • 是的,Clojure 函数和 Java 方法完全不同(从实现的角度来看)。 IIRC,考虑了从静态方法自动生成 Clojure 函数的能力,但最终出于务实的原因拒绝了。
      猜你喜欢
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多