使用let返回var绑定是不明智的吗?
(let [pipeline (Channels/pipeline)]
(.addLast pipeline "codec" (HttpClientCodec.))
;; several more lines like this
pipeline)
这里的绑定是关于词法范围(而不是def)并且传递不安全吗?
更新 在写这个问题时,我意识到上面的内容很难看。如果在Clojure中有些丑陋的东西你可能做错了。
我认为这可能是处理上述问题的更惯用的方法(这使得问题没有实际意义,顺便说一句,但仍然是方便的知识)。
(doto (Channels/pipeline)
(.addLast "codec" (HttpClientCodec.)))
答案 0 :(得分:8)
let
纯粹是词法范围,不会创建var。由let
(或loop
)创建的本地行为与函数参数完全相同。所以,是的,使用尽可能多的let
/ loop
定义的本地人,关闭它们等等是安全的。从函数返回一个局部只是返回它的值,而不是内部表示(实际上是在堆栈上,除非关闭)。因此,let
/ loop
绑定也是重入/线程安全的。
顺便说一下,对于包含大量java调用的特定代码示例,您可能需要考虑使用doto
代替或另外使用{{1}}。 http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/doto