![](/img/trans.png)
[英]Mutating Java object by using side-effecting method in a loop in Clojure
[英]Mutating a void returning Java object
我不知道如何最好地將以下 Java 代碼翻譯成 ideomatic Clojure
var lsClient = new LightstreamerClient(...);
lsClient.connectionDetails.setUser(...);
lsClient.connectionDetails.setPassword(...);
lsClient.addListener(...);
lsClient.connect();
我嘗試了很多東西,但最終還是無法編譯
(defn create-connection-and-subscriptions!
[{:keys [identifier cst token ls-endpoint]} callback]
(let [password (str "CST-" cst "|XST-" token)
client (LightstreamerClient. ls-endpoint nil)
connection-listener (client-listener-adapter/create callback)]
(doseq [c [client]]
(.setPassword (.-connectionDetails c) password)
( .setUser (.-connectionDetails c) identifier)
(.addListener connection-listener c)
(.connect c))
))
我應該如何更改它才能像 Java 代碼一樣工作。 OBS ...
在 java 代碼中只是我已經刪除了輸入。
你寫的東西很奇怪(為什么對單個項目進行doseq
?),但應該有效。 如果你想這樣做,我會用 (let [ (let [c client]
client] 替換(doseq [c [client]]
,或者只是將現有變量重命名為c
。
如果你想避免重新輸入變量名,那么doto
是使用相同的第一個參數執行多個副作用的工具。 對於你只調用兩個方法的對象來說,這是否值得,這不是很清楚,但你可以寫
(doto (.-connectionDetails client)
(.setPassword password)
(.setUser identifier))
(doto client
(.addListener connection-listener)
(.connect))
如果您真的致力於將所有這一切作為一個表達式來完成,並且不使用新變量,並且不介意重寫一些迷宮般的宏,那么您可以這樣寫:
(doto (LightstreamerClient. ls-endpoint nil)
(-> (.-connectionDetails)
(doto
(.setPassword password)
(.setUser identifier)))
(.addListener connection-listener)
(.connect))
我覺得這很可愛,但是代碼應該寫得可讀,而不是可愛,所以我不推薦它。 不過,您可能喜歡對它的工作原理感到困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.