我有一个需要传递给子程序的变量。子程序很可能不需要这个变量,并且为变量提供值很昂贵。是否有可能创建一个“延迟加载”对象,只有在实际使用时才会对其进行评估?我无法更改子程序本身,因此它仍然看起来像调用者的普通Perl标量。
答案 0 :(得分:6)
您需要查看Data::Lazy和Scalar::Defer。 更新:还有Data::Thunk和Scalar::Lazy。
我自己没有尝试过这些,但我不确定它们是否适用于某个物体。为此,您可以尝试使用Moose类将真实对象保留在lazy属性中handles
对象提供的所有方法。 (但是,如果子例程执行isa
检查,这将无效,除非它将isa
称为方法,在这种情况下,您可以在类中覆盖它。)
答案 1 :(得分:5)
Data::Thunk
是我所知道的最透明,最健壮的方式。
然而,我并不是它的忠实粉丝,或者试图将自己隐藏起来的任何其他类似模块或技术。我更喜欢更明确的东西,比如让代码使用难以计算的值只需调用函数来检索它。这样您就不需要预先计算您的值,您的意图更清晰可见,并且您还可以有各种选项来避免重新计算值,例如词法闭包,perl的状态变量或Memoize
等模块
答案 2 :(得分:2)
您可以查看tying。
答案 3 :(得分:1)
我建议退一步,重新思考如何构建程序。不是将变量传递给它可能不需要的方法,而是以某种其他方式使该值可用,例如另一个方法调用,可以根据需要调用(而不是在不需要时调用)。
在Moose中,这样的数据理想地存储在属性中。你可以使懒惰的属性生成,所以在第一次需要它们之前不会计算它们,但之后会保存该值,因此不需要再次计算它。