Clojure:def 到 Java 静态函数

标签 clojure

考虑以下 Clojure 代码:

(defn space? [c] (Character/isWhitespace c))

没关系。但显然,这只是另一个名称和毫无意义的重构:

(def space? Character/isWhitespace)

但是我收到编译错误:

Caused by: java.lang.RuntimeException: Unable to find static field: isWhitespace 
in class java.lang.Character

为什么找不到?它与 Clojure 函数完美配合:

(def wrap-space? space?) ; Compiles OK!

这里发生了什么?为什么使用 Java 静态函数的 def 不起作用?

最佳答案

您的前两个陈述实际上并不等同。当你说...

(def space? Character/isWhitespace)

...Clojure 正在尝试在 java.lang.Character 中查找名为 isWhitespace 的静态字段(不是方法)。当然,不存在这样的字段,这就是您收到编译错误的原因。

重写以下语句的其他正确方法...

(defn space? [c] (Character/isWhitespace c))

...将是:

  • (def space? (fn [c] (Character/isWhitespace c)))
  • (defn space? [c] (.Character isWhitespace c))

编辑

补充一点,我想 Clojure 允许 (def wrap-space? space?) 的原因是因为 space? 是什么没有任何歧义。另一方面,静态 Java 方法可以使用不同的参数集进行重载,或者可以与静态字段共享相同的名称。因此,要为静态 Java 方法添加别名,您必须明确您要为哪个方法/字段添加别名。

关于Clojure:def 到 Java 静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18581667/

相关文章:

string - 为什么以下 Clojure 未检测到回文?

clojure - 我可以将实体及其父组件一直拉到组件树中吗?

clojure - 如何判断 Clojure 中的 dosync 是否正在更新引用?

clojure - 哪些语言特性可以通过库添加到 Clojure 中?

haskell - Clojure 中的协议(protocol)和多方法在多态性方面不如 Haskell 中的类型类强大的原因是什么?

java - 在 clojure 中取消引用 java 方法

regex - 如何编写 Clojure 宏以从字符串创建正则表达式?

mysql - 如何从 Clojure 连接到 MySQL 数据库?

jdbc - 来自sql数据库的日期时间结果在clojure jdbc中不相同

deployment - 如何将 clojure Web 应用程序部署到 Amazon EC2(AWS Elastic Beanstalk + Leiningen + Compojure + Ring + Tomcat)