2016-02-19 39 views
2

实际上,这两个元数据声明之间的区别是什么?为什么你会用另一个呢?在Clojure中将元数据预加载到变量与数据结构

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

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

我认为在第一种情况下,元数据被前置到地图,而在第二种情况下,元数据被前置到变种。假设我是正确的,我仍然不明白为什么你会比另一个更喜欢一个。

回答

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