clojure 新手指南(9):元數據

咱們在定義函數的時候提到了如何去定義一個元數據。但以前只是定義它,並無明說它的用途。讓咱們再看一下以前定義的select-random函數,咱們添加了一個叫作:add的元數據。注意:元數據是以哈希表形式展示的。(鍵和值能夠是任何類型,不過key通常推薦爲關鍵字類型) java

=>(defn select-random
    "從一個列表中隨機返回一個元素"
    {:added "1.2"}  ;; 元數據
    [options]
    (nth options (rand-int (count options))))
#'user/select-random
咱們可使用下面方式去查看一個函數的元數據信息(一個哈希表):

=>(meta #'select-random)
{:ns @<Namespace user>@, :name select-random, :file "NO_SOURCE_PATH", :line 1, :arglists ([options]),  :added "1.2", :doc "從一個列表中隨機返回一個元素"}

咱們雖然只定義了一個元數據:add,可是系統卻給咱們返回了一堆元數據。這些元數據是系統默認給函數添加了,主要是函數的一些基本信息。下面是一些比較重要的信息: 數據結構

  1. :ns 命名空間
  2. :name 函數名
  3. :file 對應的源碼文件
  4. :arglists 參數列表 (一個函數刻意包含多個參數列表(見上篇),因此是lists 而不是list)
  5. :doc 函數描述

下面是一些元數據的使用場合: app

一、定義函數時,能夠添加對應的clojure的版本。這樣一旦clojure升級,你能夠系統的測試任何相關的函數。 dom

二、作一些相似java註解方面的工做。例如,若是函數已再也不使用,能夠添加:state "deprecated"。 函數

三、給函數添加一些統計信息等等。 測試

咱們可不只限於只給函數添加元數據。任何能綁定變量的均可以添加元數據,例如符號或者其餘數據結構。 spa

=>(def approaches
    (with-meta 
      (list "ferocious" "wimpy" "precarious")
      {:creator "tim"}))
#'user/approaches

=>(meta approaches)
{:creator "tim"}
相關文章
相關標籤/搜索