gpt4 book ai didi

clojure - 如何使gen类对象显示得更好

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

我有一段代码来实现包含映射的原子映射的引用

 > (def a (example.DynaRec.)

> (dosync (assoc! a 3 {:id 3 :contents "stuff"} 4 {:id 4}))
;;=> #[DynaRec@1a659078: {4 [<Atom@118eb00c: {:id 4}] 3 [Atom@242110fc: {:id 3 :contents "stuff"}]]

我想更改它在 repl 中的显示方式,以便它只输出

> a 
;;=> ({:id 3 :contents "stuff"}
;; {:id 4})

如何做到这一点?代码如下所示:

(ns example.dyna-rec  (:gen-class   :name example.DynaRec   :prefix "-"   :init init   :state state   :extends clojure.lang.AFn   :implements [clojure.lang.IDeref                clojure.lang.Seqable                clojure.lang.ILookup                clojure.lang.ITransientMap]))(defn- $ [this] (:data (.state this)))(defn- valid?  ([e]     (valid? e []))  ([this e]     (every? #(contains? e %) (:required (.state this)))))(defn -deref [this] @($ this))(defn -valAt  ([this k] ((-deref this) k nil))  ([this k nv]     (if-let [vatom ((-deref this) k nv)]      @vatom)))(defn -invoke  ([this k] (-valAt this k))  ([this k nv] -valAt this k nv))(defn -seq [this] (seq (-deref this)))(defn -count [this] (count (-deref this)))(defn -without [this obj]  (alter ($ this) dissoc obj))(defn -assoc  ([this obj] (-assoc this (:id obj) obj))  ([this k v]   {:pre [(valid? this v)          (= k (:id v))]}     (alter ($ this) assoc k (atom v))    this))(defn -conj [this obj]  (-assoc this obj))(defn -persistent [this]  (-deref this))(defn -init []  [[]  {:required  #{:id}        :data      (ref {})}])

最佳答案

要扩展经典的 java 模型(clojure 包含),您可以实现自己的 .toString 来生成正确的字符串,然后告诉 REPL 如何正确打印这个新类

首先向 dyna-rec.clj 添加一个 super 基本的 toString:

(defn- -toString [this]
(str (into {} this)))

可以这样调用:

 (defn- -toString [this]
(str (zipmap (keys this) (map deref (vals this)))))

example.DynaRec> (.toString a)
"{}"
example.DynaRec> (str a)
"{}"

然后改进打印机以匹配您想要的输出:

(defn- -toString [this]
(str (zipmap (keys this) (map deref (vals this)))))

并测试它:

example.DynaRec> (str a)
"{3 {:id 3, :contents \"stuff\"}, 4 {:id 4}}"
example.DynaRec>

这仍然不能在 REPL 上正确打印,所以我们需要扩展打印机使用的多重方法(打印方法),REPL 使用它来了解您的新类:

(defmethod print-method 
example.DynaRec
[this, w]
(print-method (zipmap (keys this) (map deref (vals this))) w))

这会产生你想要的东西:

example.DynaRec> a
{3 {:id 3, :contents "stuff"}, 4 {:id 4}}

关于clojure - 如何使gen类对象显示得更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12416355/

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