String 将自定义类型转换为字符串

String 将自定义类型转换为字符串,string,clojurescript,String,Clojurescript,给定Clojurescript中的自定义数据类型: (deftype Foo [bar]) 我希望能够使用str宏将此类型转换为字符串。(str(->Foo“bar”)的结果总是“[object object]”。浏览各种文档和源代码时,我发现了允许我定义自定义字符串表示形式的IPrintWithWriter协议。因此,下面的扩展非常接近我所寻找的: (extend-type Foo IPrintWithWriter (-pr-writer [this writer _] (-writ

给定Clojurescript中的自定义数据类型:

(deftype Foo [bar])
我希望能够使用
str
宏将此类型转换为字符串。
(str(->Foo“bar”)
的结果总是
“[object object]”
。浏览各种文档和源代码时,我发现了允许我定义自定义字符串表示形式的
IPrintWithWriter
协议。因此,下面的扩展非常接近我所寻找的:

(extend-type Foo
  IPrintWithWriter
  (-pr-writer [this writer _] (-write writer (str "test:" (.-bar this)))))
实际上,当使用
(pr str(->Foo“bla”)
时,返回值实际上就是字符串
“test:bla”
。但是,
str
的返回值保持为
“[object object]”

如何为
str
而不是
pr str
提供
Foo
的自定义字符串表示形式?

ClojureScript使用
对象。toString
方法作为其参数传递:

(str x)返回x.toString()

您可以为
Foo
类型重写此方法:

(deftype Foo [bar]
  Object
  (toString [this]
    (str "Test: " bar)))
;; => cljs.user/Foo

(str (->Foo "x"))
;; => "Test: x"

注意:要涵盖所有情况,实际上需要同时应用
对象.toString
IPrintWithWriter.-pr writer
方法。这意味着您将看到
(str x)
(str[x])
的正确字符串。