2011-03-25 70 views
4

使用let返回var边界是不明智的?clojure函数,让&返回值

(let [pipeline (Channels/pipeline)] 
    (.addLast pipeline "codec" (HttpClientCodec.)) 
    ;; several more lines like this 
    pipeline) 

这里的绑定只是关于词法作用域(而不是def)而不是不安全的传递?

更新 在写这个问题,我意识到上述是丑陋的。如果Clojure中有些东西很丑,你可能会做错了。

我认为这可能是处理上述问题的更习惯方式(这使得问题没有实际意义,但是仍然方便的知识)。

(doto (Channels/pipeline) 
    (.addLast "codec" (HttpClientCodec.))) 
+1

'doto'并没有真正使这个问题没有意义,因为使用'doto'的代码版本扩展到与原始版本相同的东西。但它*会告诉你,这样做一定是完全可以的,否则'doto'就不会这样写! – amalloy 2011-03-26 01:07:08

+0

是的,这就是我的意思,以及为什么我将问题答案留给了后代:D。惯用表达揭示了底层结构。 – 2011-03-26 02:49:47

回答

8

let是纯粹的词汇范围,并且不会创建var。由let(或loop)创建的当地人的行为与函数参数完全相同。所以是的,可以根据需要尽可能多地使用定义好的局部变量,关闭它们等等。从函数返回局部变量只是返回它的值,而不是内部表示(实际上它是在堆栈上,除非关闭过度)。 let/loop绑定因此也是重入式/线程安全的。顺便说一下,对于具有大量Java调用的特定代码示例,您可能需要考虑使用doto来代替或额外使用。 http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/doto

+1

我几乎打败了你的“doto”:P – 2011-03-25 12:27:35