天天看點

(cljs/run-at (JSVM. :all) "Metadata就這樣哦")

 動态類型語言,少了靜态類型語言必須聲明變量類型的累贅,但也缺失了編譯時類型檢查和編譯時優化的好處。cljs雖然作為動态類型語言,但其提供Metadata讓我們在必要的時候可選擇地補充類型提示,以便提高代碼可讀性和供編譯器優化使用。除了上述以外,Metadata還讓我們在不影響對象本質的前提下,附加額外資訊增強元程式設計能力。

 首先要明确一點的是,Metadata不是任何對象/值都擁有的。隻有如下的對象才可附加Metadata

Symbol

Var

Collections(List,Map,Vector,Set)

Record

Type

 通過<code>meta</code>我們可以擷取對象的Metadata,若沒有則傳回<code>nil</code>。

示例1:擷取Var的Metadata

 上述示例1中是<code>(meta #'a)</code>而不是<code>(meta a)</code>,前者是擷取Var的Metadata,而後者是擷取值1的Metadata,顯然後者是沒有Metadata的。

示例2:擷取Symbol的Metadata

 通過<code>with-meta</code>我們可以擷取附加了metadata的symbol<code>'a</code>(注意作為入參的symbol<code>'a</code>不會受到影響)。

 上面我們已經看到<code>with-meta</code>的使用示例了,下面我們再看看具體的函數簽名吧。

 值得注意的是,<code>with-meta</code>會的傳回值才會附加上metadata,而入參obj不會附加上metadata。是以需要用綁定來儲存結果,以便後續使用。

 除了<code>with-meta</code>後期追加外,很多時候我們是在定義時就已經可以明确metadata的了,那麼可以兩種形式定義metadata。

 有時我們隻想定義一兩個metadata,完整寫法顯然有些累贅,那麼我們就可以采用metadata reader的寫法,小清新一下。

 縮寫是有限制,是以隻能表達如下metadata

&amp;esmp;至于其它metadata則還是要使用完整寫法處理。

另外編譯器會自動附加一下資訊到Var上。

 今天就寫到這裡,下次繼續^_^

繼續閱讀