Lazy模块中有两种力量:
val force:'a t - > 'a
强制x强制悬架x并返回其结果。如果x有 已经被迫,Lazy.force x再次返回相同的值而没有 重新计算它。如果引发异常,则会出现同样的异常 再次提出。如果x的强制试图强制x,则提升未定义 本身递归。
val force_val:'a t - > 'a
force_val x强制暂停x并返回其结果。如果x有 已经被强制,force_val x再次返回相同的值而没有 重新计算它。如果x的强制试图强制x,则提升未定义 本身递归。如果x的计算引发异常,则为 未指定force_val x是否引发相同的异常或 未定义。
似乎唯一的区别是
如果x的计算引发异常,则为 未指定force_val x是否引发相同的异常或 Undefined.`
根据我的理解,如果我们使用Undefined
,我们不知道它是否会引发原始异常或force_val
。
那背后有什么意义呢?为什么这样做?我们可以从force_val
获得任何好处吗?
答案 0 :(得分:6)
我想这是出于性能目的。
如果您关心获得相同的错误,请使用force
。如果您不想要更好的效果,请使用force_val
。
正如您所见here,force
与force_val
做同样的事情,但在发生异常时会执行额外的内存访问。
在阅读源代码并运行一些测试之后,这两个函数的行为似乎与文档所说的不同:如果仅使用force
,则始终会得到原始错误,但如果使用{{1第一个调用将引发原始异常,并且对force_val
或force_val
的所有后续调用都将引发force
。
编辑:实际上,我不确定使用Undefined
代替force_val
可以提高性能,因为force
是一个基元{{1}不是。