gpt4 book ai didi

clojure - Hiccup 中的条件句,我可以让这个更惯用吗?

转载 作者:行者123 更新时间:2023-12-02 20:01:12 25 4
gpt4 key购买 nike

Clojure 初学者在这里!我在 Noir 项目中为我的 Hiccup 代码添加了 Flash 消息支持。

我想做的是检查每个特定的消息字符串是否已设置。如果没有消息,那么我不想显示包含该消息的特定 Flash 元素。

(defpartial success-flash [msg]
[:div.alert.notice.alert-success
[:a.close {:data-dismiss "alert"} "x"]
[:div#flash_notice msg]])

(defpartial error-flash [msg]
[:div.alert.notice.alert-error
[:a.close {:data-dismiss "alert"} "x"]
[:div#flash_notice msg]])

[..]

(defpartial layout [& content]
(html5
[:head
[...]
[:body
(list
[...]
[:div.container
(let [error-msg (session/flash-get :error-message)
error-div (if (nil? error-msg) () (error-flash error-msg))
success-msg (session/flash-get :success-message)
success-div (if (nil? success-msg) () (success-flash success-msg))]
warning-msg (session/flash-get :warning-message)
warning-div (if (nil? warning-msg) () (warning-flash warning-msg))]

(list error-div success-div warning-div content))])]))

免责声明:我完全同意,您不太可能遇到需要同时打开多个特定闪光灯的情况,但请允许我尝试找出一种更好、更实用的方法实现这一点。

我相信有一种模式可以处理类似的情况。基本上我检查几个表达式的值,用这些值做一堆事情,然后根据结果采取行动。你可以用越来越可怕的(cond)来完成这个任务,但我的解决方案至少更干净一些。

提示?

最佳答案

您还可以使用when-let

(defpartial layout
[& contents]
(html5
[:body
(when-let [msg (session/flash-get :error-message)]
(error-flash msg))
(when-let [msg (session/flash-get :warning-message)]
(warning-flash msg))
(when-let [msg (session/flash-get :success-message)]
(success-flash msg))
contents))

我不是打嗝专家,但我认为这应该有效。我发现它更清楚地说明了正在发生的事情,尽管它稍微冗长一些。

关于clojure - Hiccup 中的条件句,我可以让这个更惯用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11948179/

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