Clojurewith-local-vars
とのドキュメントだけでwith-bindings
は、この 2 つを区別するのに十分ではありません。ヒントはありますか?
質問する
1247 次
2 に答える
11
新しいvar
は によって一時的に作成されwith-local-vars
ます。既存var
の は によって一時的にリバウンドし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...
于 2013-08-28T18:16:04.803 に答える
2
(with-bindings) は、バインディングマップのキーが symbol ではなく Vars であることを期待します。指定された var/values のマップをスレッド ローカル バインディングのスタックにプッシュし、指定された関数が返された後に削除するように注意します。低レベル関数です。
(with-local-vars) を使用すると、命令型スタイル (変更状態) でコーディングできます。
于 2013-08-28T18:17:04.817 に答える