gpt4 book ai didi

clojure - 根据数据类型格式化输出字符串

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

我正在编写一个 clojure 函数来将各种数据类型格式化为字符串。

我天真的解决方案:

(defn p [d]
(cond
(vector? d) (str "vector: " d)
(list? d) (str "list: " d)))

#'user/p
user> (p [1 2 3])
"vector: [1 2 3]"
user> (p '(1 2 3))
"list: (1 2 3)"

我以前没有使用过多重方法。这是一个很好的用途,还是有另一种方法来避免 cond 的臭味使用?

最佳答案

按照@rodnaph 的建议,我会去定义格式协议(protocol)并将其扩展到您需要的类型:

(defprotocol Format
(fmt [this]))

(extend-protocol Format
clojure.lang.IPersistentVector
(fmt [this] (str "vector:" this))
clojure.lang.IPersistentList
(fmt [this] (str "list:" this)))

但是我不知道哪个会有更好的性能,多方法或协议(protocol)扩展。

多方法定义可能如下所示:

(defmulti fmt class)

(defmethod fmt
clojure.lang.IPersistentVector [this]
(str "vector:" this))
(defmethod fmt
clojure.lang.IPersistentList [this]
(str "list:" this))

编辑:您可能需要查看 this question about protocols vs multimethods ,因为它们很好地解释了两者的常见用例。根据该信息,最好在您的场景中使用协议(protocol)。

关于clojure - 根据数据类型格式化输出字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9048958/

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