Clojure:多个let绑定

woo*_*ngs 6 clojure

在Java中,我通常这样做,

MyObject o1 = new MyObject();
o1.doSomething();
MyObject o2 = new MyObject();
o2.doWith(o1);
MyObject o3 = new MyObject();
o3.doWithBoth(o1, o2);
Run Code Online (Sandbox Code Playgroud)

在Clojure中,如果我使用let绑定,它可能看起来像,

(let [o1 (create-obj)]
  (.doSomething o1)
  (let [o2 (create-obj)]
    (.doWith o2 o1)
    (let [o3 (create-obj)]
      (.doWithBoth o3 o1 o2))))
Run Code Online (Sandbox Code Playgroud)

代码增长到右侧,这是丑陋的,难以维护.有一个更好的方法吗?

Mic*_*zyk 12

(let [o1 (doto (create-obj) (.doSomething))
      o2 (doto (create-obj) (.doWith o1))
      o3 (doto (create-obj) (.doWithBoth o1 o2))]
  ...)
Run Code Online (Sandbox Code Playgroud)

详情(doc doto)请见.

(更新:)这是有效的,因为在每种情况下,它是您正在调用方法的新创建的对象.相反,如果你想打电话,在比第一个之外的参数位置传入的新创建对象的函数/方法,你可能是最好被服务_的noisesmith描述的伎俩,虽然你可以使用dotoas->.后者的优点是不会引入一个未被清除的未使用的本地(上次我检查过Clojure只清除后续代码中实际引用的本地文件),但如果你正在调用 - void返回方法,那当然没有任何后果副作用.