UP | HOME

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