Clojure的学习笔记(二)
Metadata
identical? 和 java 中的 == 運算符是一個意思。= 和 java 中的 equal 函數是一個意思。
Metadata在Clojure中可以不改變數據的情況下給數據增加metadata,使用with-meta宏和meta宏
(def stu {:name "Stu" :email "stu@thinkrelevance.com"}) (def serializable-stu (with-meta stu {:serializable true}))那么取數據的結果如下:
(meta stu)nil (meta serializable-stu){:serializable true}可以用 ^ 代替 meta 來完成上面的工作
當我們根據一個老對象創建一個新對象的時候,老對象的metadata就會跟隨著來到新對象這里。
metadata 可以用來給一個函數指定參數和返回值類型,這在傳統的函數式編程中往往是沒有的,這點缺失也往往成為函數式語言不適合調試的明證。很幸運的是Clojure通過metadata提供了類似的能力。
比如下文我們定義了一個函數,這個函數的參數和返回值都是String類型的:
(defn #^{:tag String} shout [#^{:tag String} s] (.toUpperCase s))由于metadata的tag參數太常用,在Clojure中可以簡化為下面這個形式:
(defn #^String shout [#^String s] (.toUpperCase s))這樣,當你用一些不是String的參數來調用shout的時候就會爆出下面的錯誤:
(shout 1) java.lang.ClassCastException: \ java.lang.Integer cannot be cast to java.lang.String如果你覺得這樣定義的函數看起來有點怪異,那么便可以把這個metadata的定義放到最后來做,不過與普通的函數定義有區別的地方在于,我們要用括號包裹起函數體:
(defn shout ([s] (.toUpperCase s)) {:tag String})下面是一個有用的metadata的key列表
:arglists doc函數調用時,參數信息
:doc doc函數調用時候,文檔信息
:file 源代碼
:line 代碼當前行數
:macro 如果當前是宏則為真
:name local name
:ns namespace
:tag 期望的返回值或者參數類型
Metadata的read macro: ^#form 和 with-meta 還是不同的,一個是給編譯器增加metadata,一個是給數據加的。
轉載于:https://www.cnblogs.com/mmjx/archive/2011/10/18/2216780.html
總結
以上是生活随笔為你收集整理的Clojure的学习笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网关 Kong 折腾笔记 - 相关技术清
- 下一篇: php文件上传错误代码