【问题标题】:Difference between with-local-vars and with-bindings in ClojureClojure 中 with-local-vars 和 with-bindings 之间的区别
【发布时间】:2013-08-28 17:50:20
【问题描述】:

Clojure with-local-varswith-bindings 的文档不足以让我区分这两者。有什么提示吗?

【问题讨论】:

  • 我认为您的问题没有正确使用“动态绑定”

标签: clojure dynamic-binding


【解决方案1】:

新的vars 由with-local-vars 临时创建。现有的vars 被with-bindings 临时反弹。在这两种情况下,绑定都是线程本地的。

请注意,据我所知,with-bindings 主要用作帮助器,通过使用get-thread-bindings 返回的映射从另一个上下文传递绑定。类似的函数binding 在不导入绑定时会更典型。

示例:

(binding [*out* (new java.io.StringWriter)] 
  (print "world!") (str "hello, " *out*))
;=> "hello, world!"

(with-local-vars [*out* (new java.io.StringWriter)] 
  (print "world!") (str "hello," *out*))
;=> world!"hello,#<Var: --unnamed-->"

(with-local-vars [foo (new java.io.StringWriter)] 
  (.write @foo "world") (str "hello, " @foo))
;=> "hello, world"

(binding [foo (new java.io.StringWriter)] 
  (.write @foo "world") (str "hello, " @foo))
;=> CompilerException java.lang.RuntimeException: 
;     Unable to resolve var: foo in this context...

【讨论】:

    【解决方案2】:

    (with-bindings) 期望绑定 map 的键是 Vars,而不是符号。它将给定的 var/values 映射到线程本地绑定的堆栈上,并注意 在给定函数返回后将其删除。这是一个低级函数。

    (with-local-vars) 允许您以命令式风格(变异状态)进行编码。

    【讨论】:

      猜你喜欢
      • 2023-01-10
      • 1970-01-01
      • 2017-09-07
      • 1970-01-01
      • 2020-05-26
      • 2016-04-21
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多