如何在Clojure中扩展record类型以实现str函数?
自定义Clojure Record的字符串转换行为
你可以通过扩展clojure.core/print-method多方法实现需求——Clojure的str函数处理对象时会调用该方法生成字符串表示,为Book类型实现这个方法后,就能直接用str得到自定义格式的结果。
修改后的代码示例
(defrecord Book [title author]) (defn book->string [book] (str (:title book) " by " (:author book))) ;; 为Book类型实现print-method方法 (defmethod clojure.core/print-method Book [book writer] (.write writer (book->string book))) ;; 现在直接调用str即可得到目标结果 (str (->Book "Foo" "Bar")) ;; 输出 "Foo by Bar"
说明
print-method是Clojure负责对象打印的核心多方法,str、println等函数都会依赖它生成对象的字符串形式。- 实现时需要接收两个参数:目标对象(这里是
Book实例)和一个Writer对象,我们只需要把自定义格式的字符串写入这个Writer即可。
内容的提问来源于stack exchange,提问作者toanphan19
相关产品推荐
相关产品推荐

