Clojure中io!块的实际用途是什么?

8
一个io!块在Clojure中的使用场景是什么?我很难理解它的目的。

从未使用过它,但似乎可以强制确保一个函数/代码不在事务中使用。 - Carcigenicate
1
有趣的问题... 我快速搜索了邮件列表,发现了一篇讨论串另一篇,尤其是介绍它的讨论串(以及提交记录)。 - glts
感谢@glts提供的非常有用的链接。我认为以下两个答案很好地概括了它:“我认为它阻止其他代码使用显式io!调用包装代码。这是一种声明性的方式,表示:我正在进行io!不要在dosync内使用我。”和“关键是标记具有副作用的代码,以便您不能意外地在事务中使用它。” - Aspasia
1个回答

5

这是STM系统的一部分,确保与IO相关的代码不会在STM事务中使用。由于Clojure会在事务运行时重试事务,如果另一个线程提交矛盾的数据,则该事务产生的任何IO都将是虚假的,因为它代表了可能被丢弃的存储器状态。


1
如果您查看源代码,您会发现它只是在事务进行中抛出异常,否则按正常方式执行主体。 - Alejandro C.
这很有帮助但又抽象。一个实际使用它的示例场景:假设您正在编写一个包,其中包含一些执行IO操作的函数,其中一些已知于用户,而另一些则未知于用户。在所有这些情况下都使用(io! & body),以便在不安全的方式中使用它们(即在事务内部)时引发错误。 - jaimedash
1
我过去七年一直在专业地使用Clojure,但从未见过它被使用,因此没有常见的例子浮现在脑海中。 - Arthur Ulfeldt
谢谢你的回答!我想我终于明白了。正如上面的评论所提到的:“关键是标记具有副作用的代码,以便您不会在事务中意外使用它”,这对我来说总结得很好。 - Aspasia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接