在Clojure中将元数据前置到变量与数据结构

在Clojure中将元数据前置到变量与数据结构,clojure,Clojure,实际上,这两个元数据声明之间的区别是什么?你为什么要用一个而不是另一个 (def a0 ^{:answer-to-everything 42} {:language "ClojureScript"}) (def ^{:answer-to-everything 42} a1 {:language "ClojureScript"}) 我认为在第一种情况下,元数据是在映射前添加的,而在第二种情况下,元数据是在变量前添加的。假设我是正确的,我仍然不明白你为什么会喜欢其中一个而不是另一个。如果你想让元

实际上,这两个元数据声明之间的区别是什么?你为什么要用一个而不是另一个

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

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

我认为在第一种情况下,元数据是在映射前添加的,而在第二种情况下,元数据是在变量前添加的。假设我是正确的,我仍然不明白你为什么会喜欢其中一个而不是另一个。

如果你想让元数据跟随从一个函数传递到另一个函数的值,那么就使用第一种情况。如果你不使用第二个:

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