我正在跟踪标准Future对象的任务执行情况.该任务有以下有效状态(正如我在AbstractFuture类的Guava代码中看到的):
Future.isDone()true当且仅当状态完成,取消或中断时才返回.当且仅当状态被中断或取消时才Future.isCancelled()返回.true
好的,但我需要检查任务是否完成.有一种明显的方法可以做到这一点:
boolean isCompleted = future.isDone() && !future.isCancelled();
Run Code Online (Sandbox Code Playgroud)
不幸的是,一个讨厌的并发错误隐藏在那里.
future.isCancelled().结果是false,因为任务仍在进行中.future.cancel().future.isDone().结果是true现在.true,这是不正确的答案.如何避免这个问题?
可扩展记录是 Elm 最令人惊奇的功能之一,但自 v0.16 以来,添加和删除字段不再可用。这让我处于尴尬的境地。
考虑一个例子。我想给一个随机的东西命名t,可扩展记录为我提供了一个完美的工具:
type alias Named t = { t | name: String }
Run Code Online (Sandbox Code Playgroud)
“好的,”编译器说。现在我需要一个构造函数,即一个为事物配备指定名称的函数:
equip : String -> t -> Named t
equip name thing = { thing | name = name } -- Oops! Type mismatch
Run Code Online (Sandbox Code Playgroud)
编译失败,因为{ thing | name = ... }语法假定thing是带有name字段的记录,但类型系统不能保证这一点。事实上,Named t我试图表达一些相反的东西:t应该是一个没有自己name字段的记录类型,并且该函数将此字段添加到记录中。无论如何,字段添加是实现equip功能所必需的。
因此,equip以多态方式编写似乎是不可能的,但这可能不是什么大问题。毕竟,任何时候我要给一些具体的东西命名时,我都可以手动完成。更糟糕的是,逆函数extract : Named t -> …