【Clojure 基本知識】 關於函數參數的各種高級用法

關於Clojure函數參數用法,學習中一些總結,無廢話,直接看代碼:

一、接受不定參數

;;接受不定參數
(defn f0[& pms]
    (println "params count=" (count pms) " type pms=" (type pms))
  (doseq [pm pms]
        (println pm)
    )
)

;;調用示例

;;調用示例
user=> (f0 "abc" 111 :err) params count= 3 type pms= clojure.lang.ArraySeq abc 111 :err nil user=>

二、接受map參數,map可爲空或缺失部分或全部關鍵字,解構出的參數值爲nil

;;接受map參數,map可爲空或缺失關鍵字,解構出的參數值爲nil
(defn f1[pm  {:keys [key value]}]
 (println "pm->" pm)
 (println "key->" key)
 (println "value->" value) 
)

;;調用示例

user=> (f1 "abc" {:key "kk" :value 1})
pm-> abc
key-> kk
value-> 1
nil
user=> (f1 "abc" {:key "k2"})
pm-> abc
key-> k2
value-> nil
nil
user=> (f1 "abc" {})
pm-> abc
key-> nil
value-> nil
nil
user=>

三、接受map參數,爲解構參數設置默認值

;;接受map參數,爲解構參數設置默認值
(defn f11[pm  {:keys [key value] :or {key "def-key" value "def-value"}}]
 (println "pm->" pm)
 (println "key->" key)
 (println "value->" value) 
)

;;調用示例

user=> (f11 "abc" {:key "kk" :value 1})
pm-> abc
key-> kk
value-> 1
nil
user=> (f11 "abc" {:key "k2"})
pm-> abc
key-> k2
value-> def-value
nil
user=> (f11 "abc" {})
pm-> abc
key-> def-key
value-> def-value
nil
user=>

四、可選命名參數

;;可選命名參數
(defn f2[pm & {:keys [key value]}]
 (println "pm->" pm)
 (println "key->" key)
 (println "value->" value) 
)

;;調用示例

user=> (f2 "abc" :key "kk" :value 1)
pm-> abc
key-> kk
value-> 1
nil
user=> (f2 "abc" :key "k2")
pm-> abc
key-> k2
value-> nil
nil
user=> (f2 "abc" )
pm-> abc
key-> nil
value-> nil
nil
user=>

五、有默認值的可選命名參數

;;有默認值的可選命名參數
(defn f22[pm & {:keys [key value] :or {key "def-key" value "def-value"}} ]
 (println "pm->" pm)
 (println "key->" key)
 (println "value->" value) 
)

;;調用示例

user=> (f22 "abc" :key "kk" :value 1)
pm-> abc
key-> kk
value-> 1
nil
user=> (f22 "abc" :key "k2")
pm-> abc
key-> k2
value-> def-value
nil
user=> (f22 "abc" )
pm-> abc
key-> def-key
value-> def-value
nil
user=>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章