Clojure函数绑定和with-bindings之间有什么区别?他们似乎做了完全相同的事情,但语法略有不同.
当您需要动态选择要绑定的内容时,with-bindings很有用.这是一个有趣的例子,我们随机选择要绑定的内容:
user> (def ^:dynamic a) #'user/a user> (def ^:dynamic b) #'user/b user> (binding [a 1 b 2] (+ a b)) 3 user> (with-bindings (if (rand-nth [true false]) {#'a 1 #'b (rand-int 10)} {#'a 1 #'b 2}) (+ a b)) 3 user> (with-bindings (if (rand-nth [true false]) {#'a 1 #'b (rand-int 10)} {#'a 1 #'b 2}) (+ a b)) 3 user> (with-bindings (if (rand-nth [true false]) {#'a 1 #'b (rand-int 10)} {#'a 1 #'b 2}) (+ a b)) 1
如果你尝试使用bind,那么关于不通过文字向量作为绑定表单会感到不安.
user> (binding (if (rand-nth [true false]) {#'a 1 #'b (rand-int 10)} {#'a 1 #'b 2}) (+ a b)) IllegalArgumentException binding requires a vector for its binding in user:138 clojure.core/binding (core.clj:1865)
精彩评论