绑定和绑定之间的区别

时间:2017-05-25 17:48:18

标签: multithreading syntax clojure

Clojure函数bindingwith-bindings之间有什么区别?他们似乎完全一样,但语法略有不同。

3 个答案:

答案 0 :(得分:7)

当您需要动态选择要绑定的内容时,

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)

答案 1 :(得分:0)

实际上它做了同样的事情:

(def ^:dynamic x 1)
;;=> #'user/x

x
;;=> 1

(with-bindings {#'x 2}
   x)
;;=> 2

答案 2 :(得分:0)

您可能会注意到输入参数的微小差异:binding采用符号,而with-bindings接受变量。另外,如上所述,由于with-bindings采用地图,您可以根据应用程序逻辑动态组合它。