(Note: Tout cela devrait fonctionner tout va bien, mais je ne peux pas tester à ce moment S'il vous plaît donner votre chèque de santé mentale..)
Vous pouvez écrire
(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))))
Cela semble assez alambiquée moi, cependant. Une autre approche:
(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))))
Le motif ->
/->>
alambiquée de la première version pourrait être abstraite loin avec une macro:
(defmacro doto-guard [guard action]
`(-> ~action ~guard))
Ensuite, vous pouvez écrire
(doto (WebClient.)
(doto-guard (when user) (.setCredentials ...)))
Cela a bien propriété que vous pouvez utiliser plusieurs fois dans un seul formulaire doto
tout en mélangeant dans les clauses doto
régulière. Eh bien, c'est bien si ce genre de chose arrive plus souvent dans votre code, de toute façon. Sinon, la version basée sur let
devrait fonctionner correctement.
(Si ce modèle arrive vraiment souvent pour vous, la macro pourrait être assouplie ... Il est tentant aussi de le rendre un peu moins flexible, mais plus joli, dire en remplaçant ~guard
avec (when ~guard)
, donc Au point d'utilisation, on écrirait (doto-guard user (.setCredentials ...))
. Cependant, toute raison profonde de choisir une version particulière devrait provenir d'un contexte plus large.)
La séparation en deux corps de fonctions est juste une question de style - je préfère ne pas écrire le nil nil
lorsqu'aucune information d'identification n'est réellement fournie.
je supposé de la façon dont il a été écrit que les informations d'identification nécessaires à fixer avant que la connexion soit ouverte. Votre code s'ouvre en premier, puis définit les informations d'identification. Je ne sais pas si c'est un problème ou non. –
Non, open-open n'ouvre rien. Il * seulement * garantit que les variables liées sont (.close) d lorsque le flux de contrôle quitte le formulaire avec ouverture, que ce soit par exception ou retour normal. – dreish
Oui, vous avez raison. Mon erreur. –