2016-02-19 38 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