我怎样才能懒惰加载Perl变量?

时间:2010-09-25 07:11:14

标签: perl lazy-evaluation

我有一个需要传递给子程序的变量。子程序很可能不需要这个变量,并且为变量提供值很昂贵。是否有可能创建一个“延迟加载”对象,只有在实际使用时才会对其进行评估?我无法更改子程序本身,因此它仍然看起来像调用者的普通Perl标量。

4 个答案:

答案 0 :(得分:6)

您需要查看Data::LazyScalar::Defer更新:还有Data::ThunkScalar::Lazy

我自己没有尝试过这些,但我不确定它们是否适用于某个物体。为此,您可以尝试使用Moose类将真实对象保留在lazy属性中handles对象提供的所有方法。 (但是,如果子例程执行isa检查,这将无效,除非它将isa称为方法,在这种情况下,您可以在类中覆盖它。)

答案 1 :(得分:5)

Data::Thunk是我所知道的最透明,最健壮的方式。

然而,我并不是它的忠实粉丝,或者试图将自己隐藏起来的任何其他类似模块或技术。我更喜欢更明确的东西,比如让代码使用难以计算的值只需调用函数来检索它。这样您就不需要预先计算您的值,您的意图更清晰可见,并且您还可以有各种选项来避免重新计算值,例如词法闭包,perl的状态变量或Memoize等模块

答案 2 :(得分:2)

您可以查看tying

答案 3 :(得分:1)

我建议退一步,重新思考如何构建程序。不是将变量传递给它可能不需要的方法,而是以某种其他方式使该值可用,例如另一个方法调用,可以根据需要调用(而不是在不需要时调用)。

Moose中,这样的数据理想地存储在属性中。你可以使懒惰的属性生成,所以在第一次需要它们之前不会计算它们,但之后会保存该值,因此不需要再次计算它。