天天看点

(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上。

 今天就写到这里,下次继续^_^

继续阅读