绑定和绑定之间的区别

Dr *_*son 3 syntax multithreading clojure

是什么Clojure的功能之间的差异bindingwith-bindings?他们似乎做了完全相同的事情,但语法略有不同.

Art*_*ldt 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
Run Code Online (Sandbox Code Playgroud)

如果您尝试使用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)
Run Code Online (Sandbox Code Playgroud)