你是如何在Clojure程序中使用元數據的?Clojure元數據的一些用途是什麼?
我看到編程Clojure的一個例子:
(defn shout [#^{:tag String} message] (.toUpperCase message))
;; Clojure casts message to String and then calls the method.
都有些什麼用途?這種編程形式對我來說是全新的。
你是如何在Clojure程序中使用元數據的?Clojure元數據的一些用途是什麼?
我看到編程Clojure的一個例子:
(defn shout [#^{:tag String} message] (.toUpperCase message))
;; Clojure casts message to String and then calls the method.
都有些什麼用途?這種編程形式對我來說是全新的。
元數據被編譯器廣泛用於存儲對象類型等內容。
你,當你給類型提示
(defn foo [ #^String stringy] ....
我已經用它的東西像存儲已添加了一些填充量使用。它的目的是提供與數據「正交」的信息,在決定數值是否相同時不應考慮。
#^String
是一種類型提示。創建測試用例簡單的函數定義的一部分:
(defn #^{:test (fn [] (assert true))} something [] nil)
(test #'something)
如果你正在讀編程Clojure的,那麼第2章提供了一個很好的介紹,以元數據。圖2.3提供了常用元數據的一個很好的總結。
多樣性的一些答案,不專注於互動與語言本身:
你也可以如。跟蹤一些數據的來源。未檢查的輸入標記爲:tainted
。驗證器可能會檢查一些事情,然後將狀態設置爲:clean
。執行安全相關事項的代碼然後可以在:tainted
上禁止並僅接受:clean
ed輸入。
元數據對我來說是非常有用的打字目的。我所說的不僅僅是類型提示,而是關於完整的自定義類型系統。最簡單的例子 - 超載對於結構印刷方法(或任何其他VAR):
(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。