我正在使用pr-str
将EDN打印到字符串并与客户端进行通信。遇到非常有趣的行为,其中pr-str
还会将println
或clojure.tools.trace/trace
条消息混合到EDN字符串表示中。这是一种字符串pr-str
输出:
(TRACE from-ds {:key "asdasf", :weight 0, :tag "1"} ; trace message
{:key "asdasf", :weight 0, :tag "1"}) ; the actual edn that should be the sole output
我似乎无法在REPL中重现这一点。
为什么会这样?如何解决它?
答案 0 :(得分:2)
pr-str
使用with-out-str
,它捕获在其块内部发生的任何打印输出,并将其转换为返回的字符串。
with-out-str
创建*out*
的线程局部绑定。因此,只有在pr-str
调用中的代码记录时,才能在输出字符串中获取日志输出的唯一方法。这可以通过在pr-str
调用之外绑定值然后在该值上调用pr-str
来修复。
例如
(let [the-value (generate-some-value) ; this prints something
value-string (pr-str the-value)] ; this doesn't have trace output
...)