gpt4 book ai didi

clojure - doto 和有条件地设置属性

转载 作者:行者123 更新时间:2023-12-01 08:40:29 24 4
gpt4 key购买 nike

我想写:

(defn download-web-page
"Downloads the webpage at the given url and returns its contents."
[^String url ^String user ^String password]
(with-open [client (doto (WebClient.)
(when user (.set_Credentials (NetworkCredential. user password ""))))]
(.DownloadString client url)))

因此,我只想在将凭据作为函数的参数提供时才设置凭据。然而,它似乎并没有那样工作 - 当我用 if 替换 when 时也不会。

如果我完全删除 when ,该功能可以正常工作。

我想我不能在 doto 中使用 when - 有没有很好的方法来写这个?

最佳答案

(注意:希望这一切都能奏效,但我目前无法对其进行测试。请自行检查。)

你可以写

(defn download-web-page
"Downloads the webpage at the given url and returns its contents."
([^String url] (download-web-page url nil nil))
([^String url ^String user ^String password]
(with-open [client (doto (WebClient.)
(-> (.set_Credentials
(NetworkCredential. user password ""))
(->> (when user))))]
(.DownloadString client url))))

不过,这对我来说似乎很复杂。另一种方法:
(defn download-web-page
"Downloads the webpage at the given url and returns its contents."
([^String url] (download-web-page url nil nil))
([^String url ^String user ^String password]
(with-open [client (let [c (WebClient.)]
(when user
(.set_Credentials
(NetworkCredential. user password "")))
c)]
(.DownloadString client url))))

纠结的 ->/ ->>可以用宏抽象出第一个版本的模式:
(defmacro doto-guard [guard action]
`(-> ~action ~guard))

然后你可以写
(doto (WebClient.)
(doto-guard (when user) (.setCredentials ...)))

这有一个很好的特性,您可以在单个 doto 中多次使用它。在混合时形成常规 doto条款。好吧,无论如何,如果这种事情在您的代码中出现得更频繁,那就太好了。否则 let -based 版本应该没问题。

(如果这种模式对你来说真的经常出现,那么宏可以变得更灵活......让它稍微不那么灵活,但更漂亮,比如用 ~guard 替换 (when ~guard) ,这样在点使用一个会写 (doto-guard user (.setCredentials ...)) 。但是,选择特定版本的任何深层原因都必须来自更广泛的背景。)

拆分成两个函数体只是风格问题——我不想写 nil nil当实际上没有提供凭据时。

关于clojure - doto 和有条件地设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3713304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com