首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当试图将内容映射到println时,引用为空

当试图将内容映射到println时,引用为空
EN

Stack Overflow用户
提问于 2015-12-30 00:01:51
回答 1查看 31关注 0票数 0

我不确定我是否遇到了某种种族状况,但我正在拼凑一些测试代码,以便在Clojure中使用传统的面向对象的范例进行测试,并且遇到了一些有趣的行为。检查以下代码:

代码语言:javascript
复制
(def registrar (ref #{}))

(defrecord Person [first-name last-name])

(def rick (->Person "Rick" "James"))
(def charlie (->Person "Charlie" "Murphy"))

(dosync
  (alter registrar conj rick)
  (alter registrar conj charlie))

(defn print-record
  [record]
  (println (format "%s %s", (:first-name record), (:last-name record))))

(defn print-registrar
  "Prints a report of the registrar to stdout"
  [registrar]
  (println "Registrar's Report\n------------------")
  (map print-record registrar))

(let [registrar (deref registrar)]
  (print-registrar registrar))

当我在REPL中运行代码时,一切都很好:print-registrar成功地将记录从注册员传递到print-record,并按预期的方式打印它们:

代码语言:javascript
复制
Registrar's Report
------------------
Rick James
Charlie Murphy
(nil nil)

但是,当我试图从命令行运行代码时,我会得到以下内容:

代码语言:javascript
复制
Registrar's Report
------------------

这是因为dosync是异步调用的还是什么的?当我在调用map之前转储注册员的内容时,我看到了我对它的期望,所以我有点困惑。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-30 00:54:06

map和副作用混为一谈通常不是一个好主意,因为map很懒,因此除非有东西穿过序列并强制产生副作用,否则副作用不会发生(在本例中,repl为您做了这件事)。

我认为run!应该是这里的替补,因为print-record没有返回任何有用的东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34521047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档