在Java中,我通常这样做:
MyObject o1 = new MyObject();
o1.doSomething();
MyObject o2 = new MyObject();
o2.doWith(o1);
MyObject o3 = new MyObject();
o3.doWithBoth(o1, o2);
在Clojure中,如果我使用let绑定,它可能会像这样:
(let [o1 (create-obj)]
(.doSomething o1)
(let [o2 (create-obj)]
(.doWith o2 o1)
(let [o3 (create-obj)]
(.doWithBoth o3 o1 o2))))
代码向右边增长很丑陋,也很难维护。有没有更好的方法解决这个问题?
(as-> expr sym form1 form2 ...)
转换为(let [sym expr sym form1 sym form2 ...] sym)
。请在 REPL(>= 1.5.0)中查看(doc as->)
,或者访问 此链接 在 Clojure API 页面上查看相同内容。(我找不到稳定的 1.5.x API 链接,所以我链接到“当前”页面。) - Michał Marczykdoto
中使用as->
:(doto 1 (as-> foo (+ foo 2) (* foo 3) (println foo)))
打印出 9 并返回 1。 - Michał Marczyk(new MyObject)
代替(create-obj)
吗?“惯用的Clojure代码直接调用Java库”Halloway。 - Thumbnail