当我尝试记录其值时,LazySeq 正在踢我的屁股。
(require '[clojure.tools.logging :as log])
(def layer->multipart [{:name "layer-name" :content "veg"} {:name "layer-tag" :content "abs"}])
(def field->multipart [{:name "field-id" :content "12345"} {:name "field-version" :content "v1"}])
(log/infof "concat is %s" (concat layer->multipart field->multipart))
; => 2016-02-16 16:31:11,707 level=INFO [nREPL-worker-38] user:288 - concat is clojure.lang.LazySeq@87177bed
; WTF is clojure.lang.LazySeq@87177bed?
我已经检查了 How to convert lazy sequence to non-lazy in Clojure答案,它表明我需要做的就是doall,我所有的梦想都会实现。但可惜...不。
(log/infof "concat is %s" (doall (concat layer->multipart field->multipart)))
; => 2016-02-16 16:31:59,958 level=INFO [nREPL-worker-40] user:288 - concat is clojure.lang.LazySeq@87177bed
; still clojure.lang.LazySeq@87177bed is not what I wanted
我观察到 (pr-str (concat layer->multipart field->multipart)) 做了我想要的事情,但它没有意义; pr-str 的文档说了一些关于“pr 到字符串”的内容,pr 的文档说“将对象打印到输出流,即 *out* 的当前值。”。我不希望任何内容*输出*,我只想返回字符串值,以便记录器可以使用它!
(log/infof "concat is %s" (pr-str (concat layer->multipart field->multipart)))
; => 2016-02-16 16:42:02,927 level=INFO [nREPL-worker-1] user:288 - concat is ({:content "veg", :name "layer-name"} {:content "abs", :name "layer-tag"} {:content "12345", :name "field-id"} {:content "v1", :name "field-version"})
; this is what I wanted but I don't want anything going to *out*...or do I?
我必须做什么才能获得 pr-str 变体的效果,而不用担心任何东西无意中转储到标准输出(我猜这就是 *out* )?我希望完全实现用于记录的惰性序列(它永远不会变得太大......它最终只会像连接事故一样惰性)。
如何记录 LazySeq 的完整值?
最佳答案
问题是记录器在后台对您的惰性序列调用 .toString
。试试这个:
user=> (.toString (concat layer->multipart field->multipart))
;; "clojure.lang.LazySeq@87177bed"`
您真正想要的是将序列的内容转换为字符串。例如:
(log/infof "concat is %s" (apply str (concat layer->multipart field->multipart)))
;; Feb 16, 2016 5:10:19 PM clojure.tools.logging$eval420$fn__424 invoke
;; INFO: concat is {:name "layer-name", :content "veg"}{:name "layer-tag", :content "abs"}{:name "field-id", :content "12345"}{:name "field-version", :content "v1"}
顺便说一下,pr-str
也很好。正如其名称所示,它打印到字符串,而不是 *out*
。您正在使用该字符串。
关于clojure - 我不知道如何记录/了解 LazySeq 的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35446001/