Clojure系列- 好用的「let」和「_」
let 应该天生就是为了使代码清晰而生的。
let
let 是为了绑定变量用的,这个变量可以是任何的结构,包括函数。
当前有个函数(摘自《clojure in action》),形式是这样的:
(defn average-pets [] (/ (apply + (map :number-pets (vals users))) (count users)))
其中用到的users结构是这样的:
(def users {"www" {:password "one" :no 12} "zzz" {:password "lala" :no 44}})
看上去这个average-pets比较复杂,主要是计算的时候,取了各种数据。用let的话,就隔离开了同时计算和取值的这种问题。改造后的:
(defn average-pets-2 [] (let [user-data (vals users) number-pets (map :no user-data) total (apply + number-pets) count-user (count users)] (/ total count-user)))
这样就把取值和计算分开了。
_
在let中,这个vector的内容必须是成对出现的,假如我们只需要在let中,println输出一下某个绑定的字段值,这个时候其实不需要为该print的form指定绑定名,用下划线“_”来替代。
(defn average-pets-2 [] (let [user-data (vals users) number-pets (map :no user-data) _ (println "no:" number-pets) total (apply + number-pets) _ (println "total:" total) count-user (count users)] (/ total count-user))) (average-pets-2) ;; 运行会输出: ;; no: (12 44) ;; total: 56