Clojure 中函数的类型提示
Posted
技术标签:
【中文标题】Clojure 中函数的类型提示【英文标题】:Type hinting for functions in Clojure 【发布时间】:2011-03-02 09:49:45 【问题描述】:我正在尝试解决 Clojure 中的反射警告,该警告似乎是由于对作为普通 Java 对象的函数返回值缺乏类型推断造成的。
演示该问题的简单示例代码:
(set! *warn-on-reflection* true)
(defn foo [#^Integer x] (+ 3 x))
(.equals (foo 2) (foo 2))
=> Reflection warning, NO_SOURCE_PATH:10 - call to equals can't be resolved.
true
解决此问题的最佳方法是什么?这可以通过类型提示来完成吗?
【问题讨论】:
您使用的是哪个版本的 Clojure?我在我的 Clojure v1.0 中尝试了您的示例,它似乎工作正常...... 这是一个 clojure 1.2 版本。请注意,警告仅显示为 (set!warn-on-reflection true),这可能有所不同...。编辑问题以使其更清晰 是的,就是这样。我现在看到了。 【参考方案1】:这两个版本似乎可以工作:
user> (defn foo [^Integer x] (+ 3 x))
#'user/foo
user> (.equals (foo 2) (foo 2))
Reflection warning, NO_SOURCE_FILE:1 - call to equals can't be resolved. ;'
true
user> (.equals ^Integer (foo 2) ^Integer (foo 2))
true
user> (defn ^Integer foo [^Integer x] (+ 3 x))
#'user/foo
user> (.equals (foo 2) (foo 2))
true
请注意,在 1.2 版本之前,Clojure 中的类型提示仍然有点变化,所以这可能不会永远以同样的方式工作。另请注意,#^
已被弃用,取而代之的是 ^
。
【讨论】:
太好了,非常感谢!也很高兴了解不断变化的语法......我猜生活在最前沿的乐趣:-) 太棒了!期待使用它来加速我的代码:)以上是关于Clojure 中函数的类型提示的主要内容,如果未能解决你的问题,请参考以下文章