您如何在Clojure计划中使用元数据?
我在 Programming Clojure 中看到了一个例子:
(defn shout [#^{:tag String} message] (.toUpperCase message))
;; Clojure casts message to String and then calls the method.
有什么用途?这种编程形式对我来说是全新的。
答案 0 :(得分:26)
#^String
是类型提示。创建简单的测试用例作为函数定义的一部分:
(defn #^{:test (fn [] (assert true))} something [] nil)
(test #'something)
如果您正在阅读Programming Clojure,那么第2章提供了一个很好的元数据介绍。图2.3提供了常见元数据的一个很好的总结。
答案 1 :(得分:16)
对于多样性的一些答案,它不专注于与语言本身的交互:
你也可以。跟踪一些数据的来源。未选中的输入标记为:tainted
。验证器可能会检查事物,然后将状态设置为:clean
。执行安全相关事项的代码可能会在:tainted
上进行关注并且仅接受:clean
输入。
答案 2 :(得分:5)
元数据对于我来说非常有用。我说的不只是类型提示,而是关于完整的自定义类型系统。最简单的例子 - 为结构(或任何其他var)重载print-method:
(defstruct my-struct :foo :bar :baz)
(defn make-my-struct [foo bar baz]
(with-meta (struct-map my-struct :foo foo :bar baz :baz baz)
{:type ::my-struct}))
(defmethod print-method
[my-struct writer]
(print-method ...))
通常,与Clojure验证功能一起,它可以提高安全性,同时提高代码的灵活性(尽管实际编码需要更多时间)。
有关输入的更多提示,请参阅types-api。
答案 3 :(得分:1)
元数据来存储对象的类型 在提供类型提示时使用它
(defn foo [ #^String stringy] ....
我已将它用于存储添加到数字中的填充量等内容。它用于与数据“正交”的信息,在决定您的值是否相同时不应考虑。