Dr *_*son 3 syntax multithreading clojure
是什么Clojure的功能之间的差异binding和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
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)