当在用 defn 声明的函数上类型注解返回类型时,Clojure 支持两种有效位置:
在 var 上
(defn ^String hello []
"Hello")
或在 arg-vector 上
(defn hello ^String []
"Hello")
尽管如此,前一种方法从未被优先考虑。也就是说,您实际上应该在 arg-vector 中进行类型注解,以下是一些原因:
当您在 var 上进行类型注解时,注解将被评估。因此,您不能对原始类型进行类型注解,因为 ^long 会解析为 long 函数,而不是类型。所以对于原始类型注解,这实际上不起作用。
如果您有一个多态函数,其中不同的多态性返回不同的类型,只有后者语法允许您对所有类型进行适当的注解。
在存在两种注解的情况下,将使用 arg-vector 注解。
在 var 上的注解对于阅读代码的程序员来说是模糊的,您是在注解函数的返回值还是在 var 中的值(在这种情况下将是一个函数)。Clojure 将将其用作返回值的提示,但由于对于 def
注解是关于 var 中的值,而相对于 defn
注解将是关于 var 中函数的返回值,这可能会造成混淆。
因此,我建议始终通过向 arg-vector 添加提示来注解返回值,即使两种方法都可以工作。