我们在定义函数的时候提到了如何去定义一个元数据。但之前只是定义它,并没有明说它的用途。让我们再看一下之前定义的select-random函数,我们添加了一个叫做:add的元数据。注意:元数据是以哈希表形式展现的。(键和值可以是任何类型,不过key一般推荐为关键字类型)
=>(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,但是系统却给我们返回了一堆元数据。这些元数据是系统默认给函数添加了,主要是函数的一些基本信息。下面是一些比较重要的信息:
- :ns 命名空间
- :name 函数名
- :file 对应的源码文件
- :arglists 参数列表 (一个函数刻意包含多个参数列表(见上篇),所以是lists 而不是list)
- :doc 函数描述
下面是一些元数据的使用场合:
1、定义函数时,可以添加对应的clojure的版本。这样一旦clojure升级,你可以系统的测试任何相关的函数。
2、做一些类似java注解方面的工作。例如,如果函数已不再使用,可以添加:state "deprecated"。
3、给函数添加一些统计信息等等。
我们可不仅限于只给函数添加元数据。任何能绑定变量的都可以添加元数据,例如符号或者其他数据结构。
=>(def approaches
(with-meta
(list "ferocious" "wimpy" "precarious")
{:creator "tim"}))
#'user/approaches
=>(meta approaches)
{:creator "tim"}