在Clojure中将元数据预先添加到var与数据结构

时间:2016-02-19 20:40:42

标签: clojure

这两个元数据声明之间的区别是什么?你为什么要用一个呢?

(def a0 ^{:answer-to-everything 42} {:language "ClojureScript"})

(def ^{:answer-to-everything 42} a1 {:language "ClojureScript"})

我认为在第一种情况下,元数据被添加到 map 之前,而在第二种情况下,元数据被添加到 var 之前。假设我是正确的,我仍然不明白为什么你会偏爱另一个。

1 个答案:

答案 0 :(得分:2)

如果您希望元数据遵循从函数传递到函数的值,则使用第一种情况。当你不使用第二个时:

user> (def a0 ^{:answer-to-everything 42} {:language "ClojureScript"})
#'user/a0
user> (def ^{:answer-to-everything 42} a1 {:language "ClojureScript"})
#'user/a1
user> (print-the-metadata-from-a-function a0)
{:answer-to-everything 42}
nil
user> (print-the-metadata-from-a-function a1)
nil
nil
user> (print-the-metadata-from-a-function #'a1)
{:answer-to-everything 42, :line 74, :column 6, :file *cider-repl api*, :name a1, :ns #namespace[user]}
nil