Clojure函数binding
和with-bindings
之间有什么区别?他们似乎完全一样,但语法略有不同。
答案 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
采用地图,您可以根据应用程序逻辑动态组合它。