在以下示例中(摘自 Programming Clojure, 2nd ed 书:
(defn ^{:tag String} shout [^{:tag String} s] (.toUpperCase s))
:tag 元数据的值是多少? 做一个:
((map #'shout) :tag)
产生java.lang.String,但是如果我无法区分输入和输出参数,到底会传达什么信息?
最佳答案
我在阅读《Programming Clojure》第三版时遇到了同样的问题,其中示例略有更新:
(defn ^{:tag String} shout [^{:tag String} s] (clojure.string/upper-case s))
这相当于缩写形式:
; I guess tags and type hints are equivalent
(defn ^String shout [^String s] (clojure.string/upper-case s))
正如您所说,如果您查找函数元数据,如果标签引用输入或输出参数,则它是不明确的:
(meta #'shout)
...返回
{:tag java.lang.String,
:arglists ([s]),
etc... }
如果您考虑一下,它必须是返回类型,因为函数可以有 N 个参数,但 Clojure 不允许多个返回值。元数据中的 :tag 不是向量,而是单个值。
如果您实际上以编程方式需要函数参数的标记/类型提示,则可以在 :arglists 上调用元函数,如下所示:
关于clojure - :tag metadata clojure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14185129/