在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描述的伎俩,虽然你可以使用doto带as->.后者的优点是不会引入一个未被清除的未使用的本地(上次我检查过Clojure只清除后续代码中实际引用的本地文件),但如果你正在调用 - void返回方法,那当然没有任何后果副作用.