你能扩展一个类型/记录来实现 Clojure 中的 str 函数吗?

toa*_*n19 2 clojure

我有一个Book用 定义的类型defrecord,以及一个将其转换为字符串的函数:

(defrecord Book [title author])
(defn book->string [book] (str (:title book) " by " (:author book))) 

(book->string (->Book "Foo" "Bar"))  ;; "Foo by Bar"
Run Code Online (Sandbox Code Playgroud)

是否可以延长记录以便我可以拨打电话(str (->Book "Foo" "Bar"))

Mar*_*ůda 9

您不必扩展任何内容,只需覆盖toString方法即可:

(defrecord Book [title author]
  Object
  (toString [_] (str title " by " author)))
Run Code Online (Sandbox Code Playgroud)

测试:

(str (->Book "Foo" "Bar"))
=> "Foo by Bar"
Run Code Online (Sandbox Code Playgroud)

  • 但也可以考虑根本不这样做。`toString` 用于调试,并且记录已经具有很好的调试字符串表示形式。如果要将对象呈现给用户,请使用与“str”不同的函数。 (2认同)